Использование Linq для фильтрации родителей по их детям - PullRequest
1 голос
/ 22 декабря 2010

Возникли проблемы с моим приложением Silverlight (со службами RIA), фильтрующим мои результаты.Идея заключается в том, что на клиенте я настроил EntityQuery, его фильтры и загрузку вызовов.Однако это не работает для меня.

Вот мой код.

public void FireQuery(string filterValue)
{
    EntityQuery<Parent> query = m_ParentDomainContext.GetParentQuery();
    query = query.Where(p => p.Children.Any(c => c.Name.Contains(filterValue)));
    m_ParentDomainContext.Load(query, Query_Completed, null);
}

Компилируется просто отлично, однако во время выполнения я получаю «Оператор запроса« Любой »не поддерживается».Исключение.Кто-нибудь знает хороший способ фильтрации, как это?Опять же, я ищу способ настроить это на клиенте.

РЕДАКТИРОВАТЬ: я должен отметить, что я пробовал несколько других запросов, с похожими результатами:

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Count() != 0);

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).FirstOrDefault != null);

query = query.Where(p => p.Children.Where(c => c.Name.Contains(filterValue)).Any());

Оператор запроса 'Count / FirstOrDefault / Any' не поддерживается.Я явно что-то здесь упускаю ...

1 Ответ

1 голос
/ 09 февраля 2011

Поскольку я попытался немного поэкспериментировать с этим, я понял, что такие методы, как First, Any и Count, нельзя использовать с LINQ to Entities (и, я полагаю, даже NHibernate) поверх WCF RIA Services, потому что они 'не определены в самом IQueryable, но, например, являются методами расширения, определенными в пространстве имен System.Linq.Именно поэтому это отображается как исключение времени выполнения, а не ошибка времени компиляции.Здесь можно использовать только те методы расширения, которые есть в System.ServiceModel.DomainServices.Client (например, Where, Skip, Take, OrderBy и т. Д.).

Это связано с объектами EntityQuery, потому чтонеобходимо создать и отправить обратно на сервер, тогда как для коллекций (таких как m_ParentDomainContext.Parents в вашем случае) вы можете свободно использовать методы расширения System.Linq.

Для реализации этой функциональности,Я предлагаю, как сказал Томас Левеск, выставить его с сервера, чтобы получить только те данные, которые вам нужны, или, альтернативно, вы можете составить запрос, используя доступные конструкции (в System.ServiceModel.DomainServices.Client), а затем применить другойфильтрует полученные данные (где вы можете использовать методы расширения из пространства имен System.Linq).

PS: я пробовал это как с классической Entity Framework, так и с Entity Framework CodeFirst, и получил те же результаты.

Надеюсь, это поможет

...