Как создать динамический запрос linq для фильтра на основе сервиса ria?

Предположим, у меня есть таблица Person (PersonID, Name, ....). Затем я использую EF для создания модели Entity, а затем создаю DomainService на основе Ria Service. На стороне клиента (сливерлайт) я пытаюсь создать динамический 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 KentZhou    schedule 10.12.2009    source источник


Ответы (2)


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

person Jeff Handley    schedule 11.03.2010

Вам нужно использовать 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.

person Doguhan Uluca    schedule 05.04.2012