首先是EF代码 - 将集合添加到集合中,适当使用skip()和take()

时间:2012-09-11 16:52:19

标签: linq collections entity-framework-4

我有这样的事情:

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();是否合适,或者我可以做得更好吗?

3 个答案:

答案 0 :(得分: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;

请注意,如果要将TakeSkip与LINQ to Entities一起使用,则需要按某些属性进行排序。如果有疑问,只需通过帖子Id订购。

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

答案 1 :(得分: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);
}

答案 2 :(得分:-1)

您正在跳过所有15条记录。使用以下

替换此

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

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

希望这会有所帮助。