OrderBy ("it." + Sort) - Жесткое кодирование в рамках LINQ to Entity? - PullRequest
5 голосов
/ 23 июля 2010

Я пытался использовать динамическое 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? Я не могу поверить, что структура была бы реализована таким образом, возможно, я что-то упустил из виду?

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

Ответы [ 2 ]

7 голосов
/ 23 июля 2010

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

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

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

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

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

... будет работать.

1 голос
/ 23 июля 2010

Пока что нет ничего хорошего

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

...