鉴于以下示例模型,我需要按其所有者的属性查询项目。这是实体框架集,我想使用 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
}
我已经有一个带有 Owners 过滤器的PredicateBuilder 。
我想将这个谓词(它基本上是where子句的内容)应用于Owner
对象,以获取Item
其所有者满足谓词条件的所有对象。
如果Owner
是所有者列表...我可以使用.Any(predicate)
,但它的基数是 1。
编辑:
我试图这样做是为了避免必须得到所有Owners
满足谓词条件的东西,然后再做一个Contains(idOwner)
.
db.Items.Where(c => OwnerIdsCollection.Contains(c.idOwner ?? 0));
我已经看到了它为甚至没有相关的所有者创建的大量 SQL CASE Items
。
编辑 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;
}
标准是从用户过滤器中获得的。然后,我通常用它来查询 Owners 集合db.Owners.Where(predicate)
;
现在,从概念上讲,我需要执行以下操作: db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))