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

例如:

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 执行此操作?理想情况下,条件会进入 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

回答子问题



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/

10-12 12:48
查看更多