实体框架6-渴望加载和过滤嵌套集合

实体框架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(); 

注:每个路径必须包含

百科:EF+ Query IncludeFilter

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