应用 PredicateBuilder 查询项列表的单个对象属性

本文关键字:单个 对象 属性 列表 PredicateBuilder 查询 应用 | 更新日期: 2023-09-27 18:32:53

鉴于以下示例模型,我需要按其所有者的属性查询 ITEMS。这是实体框架集,我想使用 LINQ 执行此操作。

public class Owner
  {
    public int Id { get; set; }
    public string Name { get; set; }
    //More than 20 other properties
  }
  class Item
  {
    public int Id { get; set; }
    public string Description { get; set; }
    public Owner MyOwner { get; set; }
    public int idOwner { get; set; }
    //Several others properties
  }

我已经有一个带有所有者过滤器的谓词生成器。

我想将此谓词(它基本上是 where 子句的内容(应用于Owner对象,以便获取其所有者满足谓词条件的所有Item

如果Owner是所有者列表...我可以使用.Any(predicate)但它的基数是 1。

编辑:

我正在尝试这样做以避免必须获取满足谓词条件的所有Owners,然后执行Contains(idOwner)

db.Items.Where(c => OwnerIdsCollection.Contains(c.idOwner ?? 0));

我已经看到了它在引擎盖下为甚至没有相关Items的所有者创建的大量SQL CASE。

编辑 2 - 谓词:

public static Expression<Func<Owner, bool>> GetPredicate(OwnerCriteria criteria)
{
     var predicate = PredicateBuilder.True<Owner>();
     if (criteria.Active.HasValue) {
    predicate = predicate.And(p => p.Active == criteria.Active.Value);
     }
     //Several other criteria checkings as above
    return predicate;
}

条件是从用户筛选器中获取的。然后,我通常使用它来查询所有者集合做db.Owners.Where(predicate);

现在,从

概念上讲,我需要做这样的事情:db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))

应用 PredicateBuilder 查询项列表的单个对象属性

你能简单地尝试一下:

Items.Where(i => predicate(i.Owner))

根据您的编辑 2

db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner))