开发者

How to create a dynamic linq query for filter based on ria service?

开发者 https://www.devze.com 2022-12-13 14:48 出处:网络
Suppose 开发者_运维百科I have a table Person(PersonID, Name, ....). Then I use EF to create a Entity model and then create DomainService based on Ria Service. At client side(sliverlight), I try to cre

Suppose 开发者_运维百科I have a table Person(PersonID, Name, ....). Then I use EF to create a Entity model and then create DomainService based on Ria Service. At client side(sliverlight), I try to create a dynamic linq for filter function. What I did is:

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

That is fine. Then I have another two tables for phone:

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

Then I want to add filter to match PhoneNumber. How to write the linq query q like?

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

I can pass the compiliation, but when run the app, I got error: Query operator 'Count' is not supported

How to resolve this problem?


This sounds like a good scenario for writing a custom query method on the server and invoking that method instead of the default query for Person. RIA Services only supports a subset of LINQ operations on the client, but you can use all LINQ operators on the server.


You need to use the QueryBuilder

Here's a sample

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

Then you can take qb and apply it to whatever query you like.

query = qb.ApplyTo(query);

By using Func<QueryBuilder<Person>> you can pass around your dynamic filter into common controls and etc. And when you invoke the function you'll get the current values from that ViewModel.

0

精彩评论

暂无评论...
验证码 换一张
取 消