Заставить EF6 использовать VARCHAR вместо NVARCHAR в выражениях QUERY ⇐ C#

Место общения программистов C#
Anonymous
Заставить EF6 использовать VARCHAR вместо NVARCHAR в выражениях QUERY

Сообщение Anonymous »

Отказ от ответственности. Это одновременно теоретический и реальный вопрос. Наследие и другие обстоятельства делают это реальным.
Вопрос:
Могу ли я заставить EF6 использовать VARCHAR вместо NVARCHAR в выражениях QUERY?
Одной из причин может быть производительность (я знаю, что это, вероятно, неподходящее место для рассмотрения производительности, см. отказ от ответственности). В базе данных, над которой я работаю, я заметил значительную разницу в производительности. когда я использовал VARCHAR вместо NVARCHAR.
Сценарий
У меня есть 40 000 идентификаторов в списке, и я использую их для запроса моей таблицы «Клиенты».

Код: Выделить всё

List ids = new[]{"Id1", "Id2" .. "Id40000"}.ToList();
var customers = dbContext.Customers.Where(c => ids.Contains(c.Id));
Столбец Id в таблице SQL имеет вид VARCHAR(50)
, а Customers.Id — строку.
Но это приводит к этой ошибке :

"SqlException: внутренняя ошибка: достигнут предел служб выражений. Найдите в запросе потенциально сложные выражения и попытайтесь упростить их".

https://learn.microsoft.com/en-us/sql/r ... rver-ver16
Когда я смотрю на сгенерированный SQL, я вижу, что EF установил все идентификаторы как NVARCHAR,

Код: Выделить всё

WHERE ([Project1].[C10] IN (N'Id1', N'Id2', N'Id3', ..... , N'Id40000')
Если я установлю их как VARCHAR и запущу запрос непосредственно к базе данных, проблем не будет.

Код: Выделить всё

WHERE ([Project1].[C10] IN ('Id1', 'Id2', 'Id3', ..... , 'Id40000')
Итак, мой вопрос: как я могу заставить EF использовать VARCHAR в выражении?

Подробнее здесь: https://stackoverflow.com/questions/791 ... xpressions

Вернуться в «C#»