如何为基于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>>
你可以通过在你的动态过滤器进入通用控件等,当你调用该函数,你会从该视图模型得到的当前值。