varchar vs nvarchar orderby linq для юридических лиц - PullRequest
0 голосов
/ 12 октября 2018

У меня есть база данных, в которой есть таблица «Электронная почта», поле «Тема» типа varchar (200).Когда я заказываю в SQL:

select Subject from Emails order by Subject

, я получаю результаты:

  1. 100-2-00000
  2. 100000-1-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

У меня есть устаревшее настольное приложение, которое использует стороннюю сетку, который использует функции сравнения строк .NET, которые дают мне результаты в следующем порядке:

  1. 100000-1-00000
  2. 100-2-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

Я провел некоторое исследование разницы, и это, вероятно, из-засопоставление, что база данных используется.Сетка .NET использует строковые значения в качестве юникода, а sql - нет.

Я проверил, что приведение поля varchar (200) к полю nvarchar (200) для упорядочения дает те же результаты:

select Subject from Emails order by cast(Subject as nvarchar(200))
  1. 100000-1-00000
  2. 100-2-00000
  3. 1007-2-00000
  4. 1007-2-00001
  5. 1007-2-00002

Я создаю веб-приложение, использующее LINQ для репликации порядка электронной почты, отображаемого в устаревшей сетке.Порядок сетки (имеющий десятки столбцов) может быть установлен пользователями динамически.Я создаю динамические лямбда-выражения для создания последовательности заказов по вызовам, если есть порядок по нескольким столбцам.Мое последнее препятствие для этих запросов:

Есть ли способ реплицировать деталь order by cast(Subject as nvarchar(200)), создавая выражения в LINQ?

Текущий пример построения заказа:

var query = (*/Working query*/)

var e = Expression.Parameter(typeof(Email), "e");
var param = Expression.PropertyOrField(e, "Subject");
var OrderParam = Expression.Lambda<Func<Email, string>>( param, e);
query.OrderBy(OrderParam);

Этот запрос возвращает правильные результаты в порядке, равном select Subject from Emails order by Subject.Но я бы хотел, чтобы они соответствовали, как если бы субъект был nvarchar.

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

1 Ответ

0 голосов
/ 12 октября 2018

Вы можете создать представление в базе данных и использовать Linq вместо прямого запроса таблицы.Например:

create view v_emails as select cast(Subject as nvarchar) from Emails;

Затем обновите модель сущности, чтобы представление было доступно.Это позволит вам сортировать по столбцу темы в формате nvarchar без изменения типа данных в базе данных.

...