Странная ошибка LINQ при использовании переменной, но не жестко закодированной строки - PullRequest
0 голосов
/ 07 июня 2011

У меня есть простой запрос LINQ, выполняющийся поверх Entity Framework (v1) и указывающий на SQL Server Compact v3.5 SP2 (8085):

var myResults = (from m in myContext.MyData
                 join o in myContext.SomeOtherData on new { m.ID, Name = myNameVariable } equals new { o.ID, o.Name }
                 select m).ToArray();

Приведенный выше запрос завершится ошибкой:

Указанное значение аргумента для функция недействительна [Аргумент № = 1, имя функции (если известно) = isnull ]

Если я изменю запрос, просто заменив myNameVariable жестко запрограммированной строкой, он будет работать. Например:

var myResults = (from m in myContext.MyData
                 join o in myContext.SomeOtherData on new { m.ID, Name = "SomeNameValue"} equals new { o.ID, o.Name }
                 select m).ToArray();

Что здесь происходит? Я на 100% уверен, что myNameVariable имеет допустимую строку. Это определенно не ноль.

1 Ответ

1 голос
/ 07 июня 2011

EF генерирует разные SQL для этих запросов.

Для жестко запрограммированной строки в SQL используется строковый литерал.

Для переменной она использует параметр SQL для защиты от внедрения SQL (нет риска с жестко запрограммированной строкой, если вы не делаете это для себя!).

Так что SQL CE должен относиться к этим двум по-разному.

...