Когда я запускаю этот фрагмент кода:Почему мои связанные параметры идентичны (используя 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));
}
Я получаю 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)
Обратите внимание, что @p0
и @p1
оба bar
, когда я хотел, чтобы они foo
и bar
.
Я полагаю, что Linq каким-то образом связывает ссылку на переменную word
, а не ссылку на строку, на которую ссылаются в настоящее время word
? Каков наилучший способ избежать этой проблемы?
(Кроме того, если у вас есть какие-либо предложения для лучшего названия для этого вопроса, пожалуйста, поместите его в комментариях.)
Обратите внимание, что я попробовал это с регулярным Linq также, с теми же результатами (вы можете вставить это право в 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();
Сплин:
bar
jack
splat
Дополнительные комментарии и анализ этого вопроса см http://blogs.msdn.com/ericlippert/archive/2009/11/12/closing-over-the-loop-variable-considered- harm.aspx и http://blogs.msdn.com/ericlippert/archive/2009/11/16/closing-over-the-loop-variable-part-two.aspx –