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

时间:2013-09-26 02:11:50

标签: c# linq predicatebuilder

鉴于以下示例模型,我需要通过其所有者的属性查询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);

的Owners集合

现在,从概念上讲,我需要执行以下操作:db.Items.Where(x => /*Items filters*/ && x.MyOwner.Where(myOwnerPredicate))

1 个答案:

答案 0 :(得分:1)

您可以尝试一下:

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

基于 EDIT 2

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