应用 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))
你能简单地尝试一下:
Items.Where(i => predicate(i.Owner))
根据您的编辑 2:
db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner))