2010-11-15 31 views
1

我一直在使用System.Linq.Dynamic库。有没有办法使用具有一对多关系的实体。具体地说 我有3个班Dynamic.Linq建筑通用凡条件

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的名单我可以过滤。 我如何搜索关系是否是一对多的关系。 如何根据每个对象的第一项Bs(即Bs [0])筛选A对象的列表。 是否可以使用Linq.Dynamic进行过滤。

回答

1

因为ICollection<B>没有索引器,所以不能直接过滤集合关系的第一个项目(例如Bs[0]),因为一个项目没有。

然而,有可能使用谓词如Any在动态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]


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

  • 条件
  • 任何()和任何条件
  • 所有条件
  • 计数()和计数条件
  • 最大选择
  • 选择
  • 萨姆选择
  • 平均se讲师

Bs[0].Id = @0你需要有首先条件),其中您可以通过编辑界面IEnumerableSignatures添加到System.Linq.Dynamic,一个私有的副本的支持,加入

void First(); 
void First(bool predicate); 
void FirstOrDefault(); 
void FirstOrDefault(bool predicate); 

(添加尾(OrDefault)和单(OrDefault),以及将是一个合乎逻辑的步骤恕我直言。)