鉴于以下示例模型,我需要通过其所有者的属性查询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
}
我已经拥有一个PredicateBuilder的Owners过滤器。
我想将此谓词(它基本上是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 criateria checkings as above
return predicate;
}
标准是从用户过滤器获得的。
然后,我通常使用它来查询执行db.Owners.Where(predicate)
;
现在,从概念上讲,我需要执行以下操作:db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))
答案 0 :(得分:1)
您可以尝试一下:
Items.Where(i => predicate(i.Owner))
基于 EDIT 2 :
db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner))