Существует ли общий способ проверки, поддерживается ли определение свойства провайдером Linq, особенно OData? - PullRequest
11 голосов
/ 22 июня 2010

Я успешно выполнил следующий оператор с NorthWind.sdf в LinqPad:

from s in Shippers
    select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.ShipViaOrders.Count()       
}

В то же время мне не удалось выполнить аналогичный оператор со службой Odata (http://services.odata.org/northwind/northwind.svc) вLinqPad:

from s in Shippers    
select new
{
    s.ShipperID,
    s.CompanyName,      
    Count=s.Orders.Count()      
}

Ошибка «Построение или инициализация экземпляров типа <> f__AnonymousType0`3 [System.Int32, System.String, System.Int32] с выражением s.Orders.Count ()не поддерживается. ".

Я знаю, что служба OData очень ограничена в поддержке Linq. У меня есть динамическая поддержка операторов Linq в моем приложении. На самом деле я пытаюсь перенести источник данных из Compact SQL Server в службу OData.

Так что мне приходится иметь дело с NotSupportedException в общем виде. В настоящее время я пытаюсь проверить синтаксис свойства define перед его запуском, например

"s.Orders.Count() as Count"   

Он прошел мою проверку, ноон встретил NotSupportedException для OData.

Есть ли способ проверить, поддерживается ли определение свойства (с помощью строки или лямбды) поставщиком Linq?

Anyпредложения приветствуются.

Ин

Ответы [ 2 ]

6 голосов
/ 11 февраля 2011

К сожалению, нет общего программного способа проверить, сможет ли поставщик LINQ перевести любой запрос.Как правило, вам придется прибегнуть к документации или (чтобы быть уверенным) на самом деле попробовать запросы, как вы делаете.

Однако разные провайдеры могут предоставить некоторый механизм генерации некоторого представления для запроса, который выможет быть в состоянии использовать, чтобы проверить, будет ли работать запрос без необходимости его выполнения.

В случае клиента OData вы можете вызвать .ToString () для запроса, и он должен вернуть URL, если он можетуспешно обработать запрос;в противном случае будет возвращено сообщение об ошибке, похожее на «Ошибка перевода выражения Linq в URI: ...» (фактическое сообщение об ошибке может измениться в зависимости от языка пользователя, но оно будет определенно недопустимымURI).

2 голосов
/ 15 февраля 2011

К сожалению, единственный способ выяснить это - протестировать определенный запрос или с помощью документации, если создатель поставщика LINQ предоставил подробный список того, что не поддерживается.

У самой LINQ очень слабая спецификация, в значительной степени определяемая методами расширения, определенными в IQueryable / IEnumerable. Внедрение поставщика LINQ означает, что вы должны осуществить перевод по источнику данных - например, LINQ to SQL переводит дерево выражений, выраженное в запросе LINQ, в SQL, который понимается поставщиком базы данных. Каждый источник данных имеет свои собственные ограничения, которые в конечном итоге определяют, что может поддерживаться, и аналогичным образом каждый поставщик LINQ может выбрать для реализации (или не реализации) какой-либо конкретный метод или поведение.

Может случиться так, что это всего лишь ограничение провайдера в LINQPad для работы с OData - вы можете вместо этого проверить OQuery и посмотреть, предоставляет ли он лучший набор возможностей - посмотрите http://beta.code.msdn.microsoft.com/OQuery-Building-OData-d2e75eed для деталей и загрузки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...