Entity framework 4 实体框架4-如何限制另一个表中的子元素数量(通过外键连接)

Entity framework 4 实体框架4-如何限制另一个表中的子元素数量(通过外键连接),entity-framework-4,linq-to-entities,Entity Framework 4,Linq To Entities,我有两个数据模型Blog和Post。BlogId是Post表上的外键 public class Blog { public int ID { get; set; } public string Title { get; set; } public virtual ICollection<Post> Posts { get; set; } ... } public class Post { public int ID { get; set; }

我有两个数据模型BlogPost。BlogId是Post表上的外键

public class Blog
{
   public int ID { get; set; }

   public string Title { get; set; }

   public virtual ICollection<Post> Posts { get; set; }

  ...  
}


public class Post
{
   public int ID { get; set; }

   public virtual int BlogId { get; set; }

   public string Title { get; set; }

  ...  
}
公共类博客
{
公共int ID{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection Posts{get;set;}
...  
}
公营职位
{
公共int ID{get;set;}
公共虚拟int BlogId{get;set;}
公共字符串标题{get;set;}
...  
}
现在,这一切都很好,我的存储库很高兴,并按预期从数据库中提取了所有内容

我的问题是-有没有办法限制被检索的帖子的数量。也许是林克魔法

以下是存储库中当前的方法:

public Business FindBlog(int id)
{
    return this.context.Get<Blog>().SingleOrDefault(x => x.ID == id);
}
public Business FindBlog(int-id)
{
返回此.context.Get().SingleOrDefault(x=>x.ID==ID);
}
你的意思是:

public List<Post> GetBlogPosts(Blog blog, int numberOfPosts)
{
    return blog.Posts.Take(numberOfPosts);
}
public List GetBlogPosts(Blog Blog,int numberOfPosts)
{
返回blog.Posts.Take(numberOfPosts);
}

不幸的是,EFv4没有提供简单的方法来限制导航属性返回记录的数量

如果您使用的是
EntityObject
派生实体,则可以使用类似于:

var blog = context.Blogs
                  .Single(b => b.Id == blogId);

var posts = blog.Posts
                .CreateSourceQuery()
                .OrderByDescending(p => p.Date)
                .Take(numberOfRecords)
                .ToList();
如果您使用的是POCO,您必须对此执行单独的查询(如果是代理POCO,您可以访问
EntityCollection
,以访问
CreateSourceQuery
):

EFv4.1和DbContext API提供了只加载有限数量的相关实体的方法:

var blog = context.Blogs
                  .Single(b => b.Id == blogId);

context.Entry(blog)
       .Collection(b => b.Posts)
       .Query()
       .OrderByDescending(p => p.Date)
       .Take(numberOfPosts)
       .Load();
编辑:

您可以使用投影在单个查询中执行此操作:

var blog = context.Blogs
                  .Where(b => b.Id == blogId)
                  .Select(b => new 
                      {  
                          Blog = b,
                          Posts = b.Posts
                                   .OrderByDescending(p => Date)
                                   .Take(numberOfRecords)
                      })
                  .SingleOrDefault()

请注意,您必须从匿名类型的第二个参数访问帖子。

我认为,从数据库获取结果(包括与博客相关的所有帖子)后,只需选择帖子数量即可。我希望能从数据库中得到一些帖子。谢谢拉迪斯拉夫。我正在使用POCOs,我做了一些类似于您建议的事情。但是如果我能在去DB的一次旅行中完成它,我会很喜欢的。
var blog = context.Blogs
                  .Where(b => b.Id == blogId)
                  .Select(b => new 
                      {  
                          Blog = b,
                          Posts = b.Posts
                                   .OrderByDescending(p => Date)
                                   .Take(numberOfRecords)
                      })
                  .SingleOrDefault()