如何为基于ria服务的过滤器创建动态linq查询?

如何为基于ria服务的过滤器创建动态linq查询?

问题描述:

假设我有一个Person Person(PersonID,Name,....)。然后我使用EF创建实体模型,然后基于Ria服务创建DomainService。在客户端(sliverlight),我尝试为过滤器函数创建一个动态linq。我所做的是:如何为基于ria服务的过滤器创建动态linq查询?

q = EntityQuery<MyData.Person> 
q = q.Where(p=> p.Name.Contains(NameVar)); 

这很好。然后我有另外两个电话表:

Phone(PhoneID, PhoneNumber, ...) 
PersonPhone(PersonID, PhoneID, ...) 

然后我想添加过滤器来匹配PhoneNumber。如何编写linq查询q?

q = q.Where(p => p.PersonPhone. 
        Where(ph=>ph.PhoneNumber.Contains(PhoneVar)&& ph.PersonID == p.PersonID).Count()>0); 

我可以通过编撰,但运行应用程序时,我得到了错误: 查询操作“计数”,不支持

如何解决这个问题呢?

这听起来像是在服务器上编写自定义查询方法并调用该方法而不是Person的默认查询的好方案。 RIA服务仅支持客户端上的一部分LINQ操作,但您可以在服务器上使用所有LINQ操作员。

您需要使用QueryBuilder的

下面是一个示例

var qb = new QueryBuilder<Person>().Where(p => p.PersonPhone.Where(ph=>ph.PhoneNumber.Contains(PhoneVar)&& ph.PersonID == p.PersonID).Count()>0); 

然后你可以把QB并将其应用到你喜欢的任何查询。

query = qb.ApplyTo(query); 

通过使用Func<QueryBuilder<Person>>你可以通过在你的动态过滤器进入通用控件等,当你调用该函数,你会从该视图模型得到的当前值。