延迟评估Linq到SQL中的字符串

时间:2009-11-16 22:00:10

标签: linq-to-sql evaluation

使用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”,恰好是foreach循环退出后s的最后一个值。任何人都可以对这种情况有所了解吗?

感谢。

1 个答案:

答案 0 :(得分: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