ThenInclude中的Entifyframework核心2.0过滤器

时间:2017-11-08 10:56:22

标签: linq-to-entities entity-framework-core

我正在使用EF core 2.0并希望过滤子集合。谁能帮助我在EF core 2.0中如何做到这一点?

    var items = await _context.RiskType
                              .Include(r => r.Categories)
                              .ThenInclude(category => category.Alerts)
                              .ToListAsync();

在上面的代码中,我想过滤category.Alerts.where(alert=>alert.caseId==1)

由于

2 个答案:

答案 0 :(得分:0)

正如其中一条评论中所说,这尚未得到支持。但是你可以通过多种方式解决它。

首先,您可以选择()将所需数据导入匿名或DTO对象并使用它。请注意,在下面的示例代码中,EF Core会忽略.Include(),因为存在.Select()方法。但是我想用它来清楚。

Parent[] parents = context.Parent
                          .Include(p => p.Children)
                          .Select(p => new 
                           {
                               FilteredChildren = p.Children.Where(/*Filter Func for the children collection*/) 
                           })
                          .ToArray();

另一种方法是为您需要的某个Parent显式加载实体。当你必须只为一些父母加载孩子时这是很好的,但如果你有一个大集合并且想要加载所有孩子,请记住显式加载需要访问数据库。在下面的代码示例中,您说要为父条目设置.Load()a .Collection(),如果要对其进行过滤,则必须使用.Query()以便获取将用于获取的查询实体并使用.Where()方法应用过滤器。最后你只需要说.Load()来加载Parent实体中的子实体。如果要对不是集合的导航属性使用显式加载,则必须使用.Reference()方法而不是.Collection()。

Parent parent = context.Parents.Find(/*Key*/);

context.Entry(parent)
       .Collection(p => p.Children)
       .Query()
       .Where(/*Filter Func for the children collection*/)
       .Load()

我对EF很新,如果有人有更多的建议,我想看一下。

答案 1 :(得分:0)

使用EF plus即可。您可以在任一级别上进行过滤。 https://entityframework-plus.net/query-include-filter

var items = ctx.RiskType.IncludeFilter(r=>r.Categories).IncludeFilter(x => x.Categories.Select(p=>p.Alerts.Where(alert=>alert.caseId==1)))
                     .ToList();

这类似于在数据库级别上应用的包含过滤器(您可以在db profiler中看到它)。