我正在使用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)
由于
答案 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中看到它)。