2009-12-10 1 views
1

Предположим, у меня есть таблица Person (PersonID, Name, ....). Затем я использую EF для создания модели Entity, а затем создаю DomainService на основе Ria Service. На стороне клиента (sliverlight) я пытаюсь создать динамический linq для функции фильтра. Что я сделал:Как создать динамический запрос linq для фильтра, основанный на сервисе ria?

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); 

я могу передать compiliation, но при запуске приложения, я получил сообщение об ошибке: запроса с оператором «Count» не поддерживается

Как решить эту проблему?

ответ

0

Это звучит неплохо для написания пользовательского метода запроса на сервере и вызова этого метода вместо запроса по умолчанию для Person. RIA Services поддерживает только подмножество операций LINQ на клиенте, но вы можете использовать все операторы LINQ на сервере.

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.