2013-09-04 4 views
1

Я пишу функцию, в которой пользователь может ввести несколько слов для поиска по базе данных. Когда я переместил это на систесть, код перестает работать правильно.Entity Framework с несколькими предложениями Where where неверные результаты

В systest в запросе используется только последнее слово поисковых запросов.

Я привел соответствующий код в LinqPad, чтобы узнать, могу ли я реплицировать проблему. Он корректно работает с базой данных DEV и продолжает сбой в базе данных systest

var cleanTextParts = Regex.Replace("foot pain", @"[^\w]", " ", RegexOptions.None) 
    .ToLower() 
    .Split(' ') 
    .Where(s => !string.IsNullOrEmpty(s)); 

cleanTextParts.Dump(); 

var query = ClinicalFindings.AsQueryable(); 
foreach (var s in cleanTextParts) 
    { 
     query = query.Where(code => code.Description.ToLower().Contains(s)); 
    } 

var results = query.ToList(); 
results.Dump(); 

Когда я запускаю его против Дев, это SQL, который генерируется и побежал:

exec sp_executesql N'SELECT [t0].[ClinicalFindingsID], [t0].[ID], [t0].[Description], [t0.[Preferred] 
FROM [ClinicalFindings] AS [t0] 
WHERE (LOWER([t0].[Description]) LIKE @p0) AND (LOWER([t0].[Description]) LIKE @p1)',N'@p0  varchar(8000),@p1 varchar(8000)',@p0='%pain%',@p1='%foot%' 

И вот это против Systest:

exec sp_executesql N'SELECT [t0].[ClinicalFindingsID], [t0].[ID], [t0].[Description], [t0.[Preferred] 
FROM [ClinicalFindings] AS [t0] 
WHERE (LOWER([t0].[Description]) LIKE @p0) AND (LOWER([t0].[Description]) LIKE @p1)',N'@p0  varchar(8000),@p1 varchar(8000)',@p0='%pain%',@p1='%pain%' 

Обратите внимание на разницу в параметрах, используемых для ИНЕКЕ: @ p0 = '% боль%', @ p1 = '% боль%' против @ P0 = '% лапка%', @ p1 = '% боль%'

Дев является SQL 2008 R2 Systest является SQL 2005

Я планирую переместить базу данных в экземпляр 2008 R2 в Попробуйте проверить, действительно ли проблема вызвана версиями базы данных.

Как исправить это, не перейдя на другой сервер?

ответ

1

Это известная проблема (проблема с проблемой | способ ее работы) для лямбда-выражений внутри циклов. Я нашел следующую нить SO в первый раз, когда я столкнулся с этим, и это был спасатель: https://stackoverflow.com/a/295597/1803682

В основном это связано с повторным использованием ключа в выражении лямбда. Связанный ответ отлично объясняет. Быстрое и грязное исправление в том, чтобы скопировать переменную первым:

foreach (var s in cleanTextParts) { 
    var tmp = s; 
    query = query.Where(code => code.Description.ToLower().Contains(tmp)); 
} 

Я думаю, что причина вы не видите это поведение в LINQPad это не похоже, что это уже не проблема, так как в C# 5.0. Не являясь пользователем LinqPad, я предполагаю, что вы использовали C# 5.0 в LinqPad и 4.0 на тестовом сервере?

+0

@ KeithSirmons - Я правильно понял LinqPad? – Matthew

+0

Нет. Думаю, вы неправильно поняли мое заявление о LinqPad. Он продолжал терпеть неудачу с LinqPad в systest. Это не удалось в версиях .NET 3.5 и 4.0 для LinqPad. Я до сих пор не знаю, какая разница между моей рабочей станцией Dev и Systest, что касается .NET. Они имеют одинаковые пакеты обновлений и версии. Спасибо за вашу помощь. –

Смежные вопросы