3

鉴于以下示例模型,我需要按其所有者的属性查询项目。这是实体框架集,我想使用 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))

4

1 回答 1

1

你可以简单地尝试:

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

根据您的EDIT 2

db.Items.AsExpandable().Where(x => /*Items filters*/ && predicate.Invoke(x.Owner))
于 2013-09-26T13:12:09.283 回答