Linq EF Code first-将集合添加到集合中,适当使用skip()和take()

Linq EF Code first-将集合添加到集合中,适当使用skip()和take(),linq,collections,entity-framework-4,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); t

我有这样的想法:

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;

但这显然不起作用。那么,如何将集合添加到集合中?线程.Posts.Clear是否清晰;这里合适,还是我可以做得更好?

我会这样做:

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);
}

我会这样做:

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);
}

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

替换这个

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


希望这会有所帮助。

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

替换这个

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


希望这会有所帮助。

为了只从数据库中加载所需的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;
请注意,如果要将Take and Skip与LINQ to实体一起使用,则需要按某些属性排序。如果有疑问,只需按邮政Id订购即可


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

为了只从数据库加载所需的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;
请注意,如果要将Take and Skip与LINQ to实体一起使用,则需要按某些属性排序。如果有疑问,只需按邮政Id订购即可


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

您想做什么?从数据库中删除除15篇以外的所有文章,或者只是从数据库中读取的内容不超过15篇,或者…?我想跳过前15篇文章,然后再读下15篇。你想做什么?从数据库中删除除15条以外的所有内容,或者只是从数据库中读取的内容不超过15条,或者…?我想跳过前15条帖子,然后再写下15条。这就是我要找的。谢谢-陛下我做了和你建议的完全相同的事情,现在我在data.Posts==2个Posts下,我希望它是2个,所以它实际上是好的,data.Count==3个Posts我现在所有的都是好的,所以这也很好,但是在thread.Posts下,你代码的最后一行我有3个Posts!不确定出了什么问题,但我正在调试,无法检测到任何错误:/@ojek:可能是延迟加载整个集合的结果?尝试在查询之前禁用延迟加载_forumsDb.ContextOptions.LazyLoadingEnabled=false,并测试Posts集合中是否仍有3个实体。嗯,是的,是这样,但是,我不确定禁用这是否是一个好方法?@ojek:在您的特定情况下,我会说是的,这是一个好方法。请记住,您可以禁用每个上下文实例的延迟加载。因此,在下一个使用新上下文运行的查询中,可能会再次启用新的using block lazy loading。延迟加载将始终加载导航集合中的所有实体,您不能使用延迟加载进行筛选。但这正是您在示例中需要的,即只过滤前15个元素,但不获取所有帖子。你可以有一个有3000个帖子的线程,你不想完全加载。这就是我一直在寻找的。谢谢-陛下我做了和你建议的完全相同的事情,现在我在data.Posts==2个Posts下,我希望它是2个,所以它实际上是好的,data.Count==3个Posts我现在所有的都是好的,所以这也很好,但是在thread.Posts下,你代码的最后一行我有3个Posts!不确定出了什么问题,但我正在调试,无法检测到任何错误:/@ojek:可能是延迟加载整个集合的结果?尝试在查询之前禁用延迟加载_forumsDb.ContextOptions.LazyLoadingEnabled=false,并测试Posts集合中是否仍有3个实体。嗯,是的,是这样,但是,我不确定禁用这是否是一个好方法?@ojek:在您的特定情况下,我会说是的,这是一个好方法。请记住,您可以禁用每个上下文实例的延迟加载。因此,在下一个使用新上下文运行的查询中,可能会再次启用新的using block lazy loading。延迟加载将始终加载导航集合中的所有实体,您不能使用延迟加载进行筛选。但这正是您在示例中需要的,即只过滤前15个元素,但不获取所有帖子。您可能有一个包含3000个帖子的线程,您不想完全加载这些帖子;结果是{3,4},而不是空集合;结果是{3,4},而不是空集合。