Я запрашиваю базу данных MS SQL с использованием Linq и Entity Framework Code First. Требование состоит в том, чтобы иметь возможность использовать в таблице WHERE SomeColumn LIKE '%sometext'
.Как изменить sql, сгенерированный linq-to-entity?
Это, на поверхности, является простым требованием, что может быть достигнуто с помощью простого запроса Linq так:
var results = new List<MyTable>();
using(var context = new MyContext())
{
results = context.MyTableQueryable
.Where(x => x.SomeColumn.EndsWith("sometext"))
.ToList();
}
// use results
Однако, это не было эффективным на практике. Проблема заключается в том, что столбец SomeColumn
не является varchar, скорее это char (31). Это означает, что если строка сохраняется в столбце, который меньше 31 символа, тогда в конце строки будут добавлены пробелы, чтобы обеспечить длину 31 символ, и это вызывает фол до запроса .EndsWith()
.
Я использовал SQL Profiler для поиска точного sql, который был сгенерирован из метода .EndsWith()
. Вот что я нашел:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE N'%sometext'
Так , что интересно. Я не уверен, что означает N
до '%sometext'
. (Я нагуглить позже.) Но я знаю, что если взять тот же запрос и запустить его в SSMS без N
как это:
--previous query code removed for brevity
WHERE [Extent1].[SomeColumn] LIKE '%sometext'
Тогда запрос отлично работает. Есть ли способ заставить Linq и Entity Framework удалить этот запрос N
?
'' N'' в основном означает, что он смотрит на вашу строку как на varchar, что, вероятно, является вашей проблемой. – Kippie
[VARCHAR и NVARCHAR] (http://stackoverflow.com/questions/144283/what-is-the-difference-between-varchar-and-nvarchar). Что касается ошибки, которую вы получаете, это кажется странным, а не проблемой, которую я испытал, но опять же я использую «NVARCHAR» в моих последних базах данных без проблем. – XN16
@ XN16 - Я тоже предпочитаю nvarchar. К сожалению, я не имею права использовать его в этом случае. – quakkels