entity framework包括filter子集合

我在LINQ查询中为包含的项添加一些过滤条件有些困难。 我的查询是这样的

var item = _Context.Order.Include("Inner") .Include("Inner.first") .Include("Inner.second") .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))).FirstOrDefault(); 

在上面的代码中,“Inner”是另一个项目列表。 现在我需要过滤内部项目。 我只需要内部项目,过滤条件为inner.isDeleted = true。

查询应该返回一个类,

 public class Order { public string Name { get; set; } public List Inner{ get; set; } public bool IsDeleted { get; set; } } 

和InnerDetails类一样

 public class InnerDetails { public string Sample { get; set; } public bool IsDeleted { get; set; } public int firstId { get; set; } public int secondID { get; set; } public First first{ get; set; } public Second second{ get; set; } } 

任何人都可以建议我采用更好的方法,因为我是LINQ和EF的新手

免责声明 :我是项目Entity Framework Plus的所有者

EF + Query IncludeFilterfunction允许过滤相关实体。

 var item = _Context.Order .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted)) .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.first)) .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.second)) .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))).FirstOrDefault(); 

注意:您不能混用Include和IncludeFilter。

Wiki: EF + Query IncludeFilter

编辑:回答子问题

但我们只能使用EF来实现这一点

是的,在我看来,我的图书馆使用类似的投影方案

 var item = _Context.Order.Select(x => new { Order = x, Inner = x.Inner.Where(y => y.IsDeleted), first = x.Inner.Where(y => y.IsDeleted).Select(y => y.first) second = x.Inner.Where(y => y.IsDeleted).Select(y => y.second) }) .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id))) .FirstOrDefault() .Select(x => x.Order) .FirstOrDefault(); 

注意:代码尚未经过测试

编辑:回答评论

我在EF Core中遇到过这个问题。 您是否还要在EF + Core版本中实现IncludeFilter

不幸的是,即使最新的EF Core版本仍然存在投影问题并导致N + 1查询。 当新版本(稳定版或预发布版)不再出现​​此问题时,该function将可用。