我正在使用数据库架构,在更新时不会覆盖记录。而是添加记录的新副本并标记为"当前"。
例如:
Id | Current | Name | Owner
1 | false | Foo | Bar
1 | false | Foo | Bazz
1 | true | Foo | Buzz
在我的模型中,我有一个Blog
实体,其中有许多与Post
相关的实体。每个Post
都有许多Comment
与之相关:
public class Blog
{
public int Id {get; set};
public bool Current {get; set};
public ICollection<Post> Posts {get; set;}
}
public class Post
{
public int Id {get; set};
public bool Current {get; set};
public ICollection<Comment> Comments {get; set;}
}
public class Comment
{
public int Id {get; set};
public bool Current {get; set};
}
我想热切地加载一个Blog
及其Post
个Comment
以及this example from MSDN中的所有
using (var context = new BloggingContext())
{
// Load all blogs, all related posts, and all related comments
var blogs1 = context.Blogs
.Include(b => b.Posts.Select(p => p.Comments))
.ToList();
}
:
Current == true
但是,我想只包含JOIN
的数据库记录。如何使用LINQ-to-EF执行此操作?理想情况下,条件会进入ON
mongod --auth
条款 - 这可能吗?
答案 0 :(得分:2)
免责声明:我是该项目的所有者Entity Framework Plus
EF + Query IncludeFilter允许轻松过滤包含的实体。
using (var context = new BloggingContext())
{
// Load all blogs, all related posts, and all related comments
var blogs1 = context.Blogs
.IncludeFilter(b => b.Posts.Where(x => x.Current))
.IncludeFilter(b => b.Posts.Where(x => x.Current).Select(p => p.Comments.Where(x => x.Current))
.ToList();
}
注意:由于具有导航属性的库的某些限制,必须包含每个路径。
回答子问题
一个问题:发出的SQL非常大。
SQL由Entity Framework生成。由于它们如何处理投影和包含方法中的关系,SQL非常大。我们的库不生成这个SQL。
您可以使用EF+ Query IncludeOptimized更改生成的大SQL以执行多个语句。使用多个语句通常可以提高性能。
示例:
using (var context = new BloggingContext())
{
// Load all blogs, all related posts, and all related comments
var blogs1 = context.Blogs
.IncludeOptimized(b => b.Posts.Where(x => x.Current))
.IncludeOptimized(b => b.Posts.Where(x => x.Current).Select(p => p.Comments.Where(x => x.Current))
.ToList();
}
注意:由于具有导航属性的库的某些限制,必须包含每个路径。
答案 1 :(得分:1)
找到一个解决方案,使用&#34;开箱即用&#34;实体框架基于this StackOverflow answer。
关键概念是为每个实体添加一个父属性,然后向前&#34;向后&#34;从层次结构的最低层到最高层:
var query = context.Comments
.Include("Post.Blog")
.Where(comment =>
comment.Current &&
comment.Post.Current &&
comment.Post.Blog.Current )
.Select(comment => comment.Post.Blog)
.ToList();
在SO答案的评论中提到的一个重要警告:
...如果父母不存在与过滤器匹配的子女,则这些父母不会进入结果集。
答案 2 :(得分:0)
当目前不支持使用.Include()进行急切加载时进行过滤&#34;开箱即用&#34;与实体框架。你可以vote in favor of this feature here,希望它可以切入EF7。
我在一个名为EntityFramework.Include的开源库中找到了我的问题的部分答案,该文件库在急切加载时提供了一些过滤功能。
不幸的是,我只能将它用于我的层次结构中的两个(三个)级别,如下所示:
using (var context = new BloggingContext())
{
// Load all blogs and all related posts that are "Current"
var query = context.Blogs
.Where(b => b.Current)
.Include(b => b.Posts, b => b.Posts.Where(p => p.Current).ToList());
var list = query.ToListWithInclude();
}
仍在努力弄清楚如何更深入Comment
s。