0

Where メソッドが条件リストに文字列参照を追加する Linq to Sql を使用すると、問題が発生するようです。参照が変更されると、誤った結果が生成されます。たとえば、以下のコード スニペットを入力テキスト '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" に評価されることに注意してください。これsは foreach ループが終了した後の最後の値になります。誰でもこの状況について洞察を提供できますか?

ありがとう。

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 に答える