Отложенная оценка строк в Linq to SQL - PullRequest
0 голосов
/ 17 ноября 2009

Кажется, у меня проблема при использовании Linq to Sql, в которой метод Where добавляет строковую ссылку в список критериев. Когда ссылка изменяется, это приводит к ошибочным результатам. Например, приведенный ниже фрагмент кода при использовании с входным текстом «Джон Смит» возвращает все записи, имя которых содержит «Смит»

var qry = from c in ctx.Customers select c;

if (!string.IsNullOrEmpty(Name.Text))
{
    foreach(string s in Name.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
        qry = qry.Where(c => c.Name.Contains(s));
}

ResultSet.DataSource = qry;
ResultSet.DataBind();

Этот фрагмент фактически выполняет следующий SQL:

SELECT (fields)
FROM [dbo].[Customers] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[Name] LIKE @p1)

@p0='%smith%',@p1='%smith%'

Обратите внимание, что оба параметра оцениваются как "кузнец", который оказывается последним значением s после выхода из цикла foreach. Кто-нибудь может предложить некоторое понимание этой ситуации?

Спасибо.

1 Ответ

3 голосов
/ 17 ноября 2009
var qry = from c in ctx.Customers select c;

if (!string.IsNullOrEmpty(Name.Text))
{
    foreach(string str in Name.Text.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries))
    {
        var s = str;
        qry = qry.Where(c => c.Name.Contains(s));
    }
}

ResultSet.DataSource = qry;
ResultSet.DataBind();

почему, прочитайте это http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered-harmful.aspx

...