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

时间:2009-12-10 18:54:11

标签: linq wcf-ria-services

假设我有一个表Person(PersonID,Name,....)。然后我使用EF创建实体模型,然后基于Ria Service创建DomainService。在客户端(sliverlight),我尝试为过滤器功能创建动态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);

我可以通过编译,但在运行应用程序时,我收到错误: 不支持查询运算符'Count'

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您需要使用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>>,您可以将动态过滤器传递到常用控件等等。当您调用该函数时,您将从该ViewModel获取当前值。