2

我有这样的事情:

var thread = _forumsDb.Threads
                .Include("Posts")
                .Single(t => t.Id == threadId);

现在,当我有一个线程和其中的一组帖子时,我想计算这些帖子,然后取出一些并删除其余的。

var count = thread.Posts.Count();
var tmp = thread.Posts.Skip(15).Take(15);
thread.Posts.Clear();
thread.Posts = tmp;

但这显然行不通。那么,如何将收藏添加到收藏中?这里合适吗thread.Posts.Clear();,还是我可以做得更好?

4

3 回答 3

1

为了从您需要的数据库中仅加载 15 个帖子并仅执行单个数据库查询,我将使用投影:

var data = _forumsDb.Threads
    .Where(t => t.Id == threadId)
    .Select(t => new
    {
        Thread = t,
        Count = t.Posts.Count(),
        Posts = t.Posts.OrderBy(p => p.SomeProperty).Take(15)
    })
    .Single();

var count = data.Count;
var thread = data.Thread;

请注意,如果要使用LINQ to Entities,Take则需要按某些属性进行排序。Skip如有疑问,请按邮局订购Id

Thread如果和之间的关系Posts是一对多,EF 将thread.Posts使用 15 个加载的帖子自动填充集合。

于 2012-09-11T17:21:30.223 回答
0

我会这样做:

var count = thread.Posts.Count();
using (var tmp = thread.Posts.Skip(15).Take(15))
{
  thread.Posts.Clear();
  foreach (var Item in tmp) 
    thread.Posts.Add(Item);
}
于 2012-09-11T17:02:34.573 回答
-1

您正在跳过您获得的所有 15 条记录。下面使用

替换这个

var tmp = thread.Posts.Skip(15).Take(15);

var tmp = thread.Posts.Skip(15).Take(30);

希望这会有所帮助。

于 2012-09-11T17:06:26.800 回答