我正在使用一个数据库模式,其中记录在更新时不会被覆盖。而是添加记录的新副本并标记为“当前”。
例如:
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 中一样:但是,我只想包含
Current == true
所在的数据库记录。如何使用 LINQ-to-EF 执行此操作?理想情况下,条件会进入 JOIN
的 ON
子句 - 这可能吗? 最佳答案
免责声明 :我是项目 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();
}
注意:由于具有导航属性的库的某些限制,必须包含每个路径。
维基:EF+ Query Include Filter
回答子问题
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();
}
注意:由于具有导航属性的库的某些限制,必须包含每个路径。
维基:EF+ Query IncludeOptimized
关于c# - Entity Framework - 急切加载过滤器?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42338135/