我一直在使用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进行过滤。
答案 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)也是合乎逻辑的步骤恕我直言。)