EF 4.1 Linq Predicate Contains Создает желаемый SQL при использовании жестко запрограммированной строки, но не со строковой переменной - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть этот код:

string name ="M";
Expression<Func<Organization, bool>> getExpression1 = r => r.Name.Contains(name);
Expression<Func<Organization, bool>> getExpression2 = r => r.Name.Contains("M");

GetOrgListBy(getExpression); 
GetOrgListBy(getExpression2); 

public IEnumerable<Organization> GetOrgListBy(Expression<Func<Organization, bool>>   filter)
{
  return DataContext.Parties.OfType<Organization>().Where(filter).ToList();
}

Вопрос: Я передаю простое выражение в функцию репозитория, которая получает List<Organization> путем сопоставления переданного имени.Когда я просматриваю трассировку sql для getExpression1 (использует строковую переменную), выражение генерирует инструкцию [Name] like plinq_variable sql, в которой отсутствует оператор %.Мое намерение состоит в том, чтобы сгенерировать оператор [Name] like '%' + plinq_variable + '%' sql

Однако, когда я при использовании getExpression2 (жестко запрограммировал строку), выражение успешно генерирует оператор [Name] like N'%M%' sql.

Почему getExpression1 не генерирует оператор %?Как я могу заставить его генерировать оператор % в sql, как getExpression2?

1 Ответ

0 голосов
/ 01 ноября 2011

Первое выражение переводится в параметризованный запрос SQL. Переменная в предложении Where ...

[Name] like plinq_variable

... устанавливается на значение

@plinq_variable=N'%M%'

когда запрос выполнен. Второе выражение переводится в SQL-запрос с жестко закодированным строковым литералом:

[Name] like N'%M%'

Затем этот запрос выполняется напрямую.

Результат для выражений и запросов одинаков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...