Cuando ejecuto este fragmento de código:¿Por qué mis parámetros vinculados son todos idénticos (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));
}
me sale este 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)
Tenga en cuenta que @p0
@p1
y son a la vez bar
, cuando yo quería que fueran foo
y bar
.
Supongo que Linq de alguna manera vincula una referencia a la variable word
en lugar de una referencia a la cadena a la que hace referencia actualmente word
? ¿Cuál es la mejor manera de evitar este problema?
(También, si tiene alguna sugerencia para un mejor título para esta pregunta, por favor ponga en los comentarios.)
Tenga en cuenta que he intentado esto con LINQ regular también, con los mismos resultados (se puede pegar este derecho en 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();
volcados:
bar
jack
splat
Para comentarios adicionales y el análisis de este tema ver http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered- harmful.aspx y http://blogs.msdn.com/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two.aspx –