Entity framework 4 实体框架4-如何限制另一个表中的子元素数量(通过外键连接)
我有两个数据模型Blog和Post。BlogId是Post表上的外键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; }
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()