实体框架6-渴望加载和过滤嵌套集合
问题描述:
我想过滤我的实体框架v6查询,但没有太大的成功。 这里是我的表(和实体模型)。 - 文件上传 - IEnumerable的化合物 - 字符串名称实体框架6-渴望加载和过滤嵌套集合
-
复合
- IEnumerable的结果
- INT CompoundType
-
结果
- INT与resultType
我想,我对每个where子句返回所有3个集(文件,化合物结果)运行查询。 我也希望加载结果并包含NoTracking(因为这是一个Web服务)。
这可以通过SQL中的内部连接轻松实现,但由于某些原因,我无法在EF中实现同样的功能。
因此,例如,我需要得到的 列表 - 文件上传,其中FileUpload.Name =“XYZ” - 当化合物也等于3 - 其中结果等于10点
任何建议表示赞赏,因为我在过去的几天里,我一直在试图解决这个问题。
答
免责声明:我是这个项目的所有者Entity Framework Plus
EF +查询IncludeFilter功能允许过滤相关实体。
var files = context.Files
.Where(x => !x.IsDeleted)
.IncludeFilter(x => x.Compound.Where(y => !y.IsDeleted)))
.IncludeFilter(x => x.Compound.Select(y => y.Result.Where(z => !z.IsDeleted)))
.ToList();
注:每个路径必须包含
ANSWER子问题:
我想这是不可能的EF6?
此功能在EF5 & EF6中受支持。
由于SELECT N+1
问题,我们还不能支持EF Core。
答
如果您没有使用AsNoTracking还可以,还有另一种方法。
相反,您可以首先使用所需的确切数据加载子表。然后在最后,你只需加载你的顶级表。DbContext将自动映射这些关系,并且只包含那个时候加载到内存中的子数据。
伪代码:
var ctx = new MyContext();
ctx.Compounds.Where(a => ...).ToList(); // Now in ctx memory
ctx.Results.Where(a => ...).ToList() // Now in ctx memory
return ctx.FileUploads.Where(a => ...).ToList(); // Will auto hook up any relationships loaded in memory