Quando eseguo questo frammento di codice:Perché i miei parametri associati sono tutti identici (usando Linq)?
string[] words = new string[] { "foo", "bar" };
var results = from row in Assets select row;
foreach (string word in words)
{
results = results.Where(row => row.Name.Contains(word));
}
ottengo questo SQL:
-- Region Parameters
DECLARE @p0 VarChar(5) = '%bar%'
DECLARE @p1 VarChar(5) = '%bar%'
-- EndRegion
SELECT ... FROM [Assets] AS [t0]
WHERE ([t0].[Name] LIKE @p0) AND ([t0].[Name] LIKE @p1)
noti che @p0
e @p1
sono entrambi bar
, quando ho voluto che fossero foo
e bar
.
Immagino che Linq legga in qualche modo un riferimento alla variabile word
piuttosto che un riferimento alla stringa attualmente indicata da word
? Qual è il modo migliore per evitare questo problema?
(Inoltre, se avete qualche suggerimento per un titolo migliore per questa domanda, si prega di inserire nei commenti.)
Nota che ho provato questo con regolare Linq anche, con gli stessi risultati (è possibile incollare questo diritto in LINQPad):
string[] words = new string[] { "f", "a" };
string[] dictionary = new string[] { "foo", "bar", "jack", "splat" };
var results = from row in dictionary select row;
foreach (string word in words)
{
results = results.Where(row => row.Contains(word));
}
results.Dump();
Discariche:
bar
jack
splat
Per ulteriori commenti e analisi di questo problema vedere http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered- nocivo.aspx e http://blogs.msdn.com/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two.aspx –