gpt4 book ai didi

c# - Entity Framework - 急切加载过滤器?

转载 作者:行者123 更新时间:2023-11-30 15:59:02 26 4
gpt4 key购买 nike

我正在使用一个数据库架构,其中记录在更新时不会被覆盖。而是添加记录的新副本并将其标记为“当前”。

例如:

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

我想像在 this example from MSDN 中一样急切地加载一个 Blog 及其所有 Post 和所有 Comment :


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 的数据库记录。我如何使用 LINQ-to-EF 执行此操作?理想情况下,条件将进入 JOINON 子句 - 这可能吗?

最佳答案

免责声明:我是项目的所有者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


回答子问题

One concern: The SQL emitted is very large.

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com