包括过滤器子集合[重复]

Posted

技术标签:

【中文标题】包括过滤器子集合[重复]【英文标题】:Include filter child collection [duplicate] 【发布时间】:2017-04-04 07:54:52 【问题描述】:

我在为我的 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<InnerDetails> 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 的新手,任何人都可以建议我更好的方法吗?

【问题讨论】:

您到底想过滤什么 - 您是想仅包含 order.inner.isdeleted 的 order.inner 中的条目,还是要删除整个记录,例如整行订单那不符合条件?如果是第二个,如果你在 order.inner 中有 2 个条目,一个是 isDeleted = true,一个是 isDeleted - false @Alex:我在问题中提到'我只需要带有过滤条件的内部项目inner.isDeleted = true。',即我只需要包含已删除的内部记录(inner.isDeleted = true) .这仅用于内部记录,这不会影响外部记录。 您似乎正在尝试过滤嵌套列表。我认为这个问题可以帮助你***.com/questions/25183685/… 和这个***.com/questions/7079378/… 什么是 Inner.first 和 Inner.second ?? InnerDetails 下的两个不同对象 【参考方案1】:

免责声明:我是项目的所有者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();

注意:不能混用 Include 和 IncludeFilter。

维基: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

从 v1.10.0 开始,EF Core 2.x 现在支持IncludeFilter

见:Release Note

编辑:回答子问题

过滤后我如何才能包含

我们还没有ThenInclude

因此,您需要再次使用 IncludeFilter 和所有过滤器并浏览要包含的列表或实体。

【讨论】:

请问我们需要添加 EF+ 引用还是什么? 是的,您需要添加引用这个库并添加“using Z.EntityFramework.Plus”命名空间才能使用 IncludeFilter 功能。 但是我们只能使用 EF 来实现。在我的回答中 不幸的是 IncludeFilter 有很多限制,我无法让它工作 我在 EF Core 中遇到了这个问题。您是否还要在 EF+Core 版本中实现 IncludeFilter? ?【参考方案2】:

您可以在 EF Core 本身中实现这一点:

var item = 
ctx.Order.Include("Inner")
         .Select(x => x.Inner
                .Where(innerItem => innerItem.IsDeleted))
         .FirstOrDefault();

或者,

var item = 
    ctx.Order.Include(o=> o.Inner
                     .Where(x => x.IsDeleted));

【讨论】:

以上是关于包括过滤器子集合[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JPQL 查询中过滤子集合?

如何在EF6.1中过滤掉子集合

Firestore:获取带有和不带有子集合数据的集合[重复]

从多个子集合中获取文档 - Firebase [重复]

布隆过滤器实战!垃圾邮件识别?重复元素判断?缓存穿透?

SwiftUI + Firestore - 基于从 Firestore 返回的数组的过滤器列表