OrderBy (it. + sort) Жесткое кодирование в рамках LINQ to Entity?

Я пытался использовать динамический LINQ to Entity в своем приложении для указания атрибута OrderBy во время выполнения. Однако при использовании кода, как описано в большей части документации:

var query = context.Customer.OrderBy("Name");

Я получил следующее исключение:

System.Data.EntitySqlException: «Имя» не может быть разрешено в текущей области или контексте. Убедитесь, что все переменные, на которые ссылаются, находятся в области действия, что необходимые схемы загружены и что на пространства имен ссылаются правильно.

После долгих поисков я нашел эту страницу MSDN:

http://msdn.microsoft.com/en-us/library/bb358828.aspx

Который включал следующий пример кода:

ObjectQuery<Product> productQuery2 = productQuery1.OrderBy("it.ProductID");

Это побудило меня изменить код на следующий:

var query = context.Customer.OrderBy("it.Name");

После этого код работает отлично. Сможет ли кто-нибудь подтвердить, что это действительно правильный способ заставить OrderBy работать с LINQ to Entity? Не верится, что фреймворк был реализован таким образом, возможно, я что-то упустил?

Спасибо, Мэтт


person Matt    schedule 23.07.2010    source источник


Ответы (2)


Синтаксис it.Name — это ESQL, и он действительно специфичен для EF. Есть веские причины использовать это иногда (например, спецификаторы сортировки), но я обычно так не делаю.

Обычно я использую стандартные выражения LINQ:

var query = context.Customer.OrderBy(p => p.Name);

Вы также можете использовать System.Linq.Dynamic, если вы загрузите его из галереи кода, а затем исходный запрос:

var query = context.Customer.OrderBy("Name");

...заработает.

person Craig Stuntz    schedule 23.07.2010
comment
Спасибо, я попробую динамическую библиотеку и посмотрю, работает ли она. Не могли бы вы привести пример, когда было бы предпочтительнее использовать синтаксис «it»? Похоже, ваш код тесно связан с реализацией, которую вы не можете контролировать. т.е. это может измениться и, таким образом, сломать ваш код? Спасибо, Мэтт - person Matt; 09.08.2010
comment
ИМХО, единственная веская причина использовать ESQL вместо System.Linq.Dynamic - это если вам нужно использовать одну из немногих функций ESQL, недоступных в SLD, таких как сопоставления. В основном я предпочитаю S.L.D. - person Craig Stuntz; 09.08.2010

Пока нет хорошего способа

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

person st78    schedule 23.07.2010