Dynamic.Linq建筑通用Where条件

时间:2010-11-15 07:00:56

标签: linq

我一直在使用System.Linq.Dynamic库。有没有办法使用具有一对多关系的实体。再具体一点 我有3个班级

class A
{
  public int Id {get;set;}
  ...
  ...

  public Class2 class2 {get;set;}

  public ICollection<Another> Bs{get;set;}

}
class Class2
{
   public int Id{get;set;}
}
class Another
{
   public int Id {get;set;}
}

我可以在关系是一对一时过滤

public IQueryable<T> Select<T>(string condition,object value)
{
 var list=FindAll<T>();//return list of T from database
 var result=list.Where(string.Format("{0} = @0",condition),value);
}

result=Select<A>("class2.Id",1);

上面的调用给出了class2的id = 1的A对象列表。 如果关系是一对多,我怎么搜索.. 如何基于每个对象的Bs的第一项,即Bs [0]来过滤A对象的列表。 是否可以使用Linq.Dynamic进行过滤。

1 个答案:

答案 0 :(得分:1)

由于Bs[0]没有索引器,因此无法直接过滤集合关系的第一项(例如ICollection<B>),因为Any没有索引器。

但是,可以在Dynamic Linq表达式中使用result = list.Where("Bs.Any(Id = @0)", value); 等谓词,例如:

result = from a in list 
         where a.Bs.Any(b => b.Id == value) 
         select a;

相当于

EXISTS

(这转换为SQL中的Bs[0]查询。)

我认为这就是你所追求的,而不是Bs[0].Id = @0


System.Linq.Dynamic支持的谓词和聚合的完整列表似乎是:

  • 其中条件
  • 任何()和任意条件
  • 所有条件
  • 计数()和计数条件
  • 最大选择
  • 最小选择
  • 萨姆选择
  • 平均选择

对于IEnumerableSignatures,您需要支持第一条件),您可以将其添加到System.Linq.Dynamic的私有副本中,通过编辑界面void First(); void First(bool predicate); void FirstOrDefault(); void FirstOrDefault(bool predicate); ,添加

{{1}}

(添加Last(OrDefault)和Single(OrDefault)也是合乎逻辑的步骤恕我直言。)