0

在使用 Linq to Sql 时,我似乎遇到了问题,其中 Where 方法将字符串引用添加到条件列表中。当参考改变时,它会产生错误的结果。例如,下面的代码片段在与输入文本“John Smith”一起使用时会返回名称中包含“Smith”的所有记录

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%'

请注意,这两个参数都被评估为“smith”,这恰好是sforeach 循环退出后的最后一个值。任何人都可以对这种情况提供一些见解吗?

谢谢。

4

1 回答 1

3
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

于 2009-11-16T22:03:33.170 回答