实体框架包括过滤器子集合

Ish*_*ohn 9 c# linq asp.net-mvc entity-framework entity-framework-6

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

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

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

查询应该返回一个类,

public class Order
{

    public string Name { get; set; }
    public List<InnerDetails> Inner{ get; set; }
    public bool IsDeleted { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和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; }
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*nan 7

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

EF + Query IncludeFilter功能允许过滤相关实体.

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();
Run Code Online (Sandbox Code Playgroud)

注意:您不能混合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();
Run Code Online (Sandbox Code Playgroud)

注意:代码尚未经过测试

编辑:回答评论

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

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