Linq query built in foreach loop always takes parameter value from last iteration

c#, linq

Solution

You're reusing the same variable (`key`) in your lambda expression.

See my article on anonymous methods for more details, and there are a number of related SO questions too:

- LINQ to SQL bug (or very strange feature)...

- Local variables with delegates

- C# captured variable in a loop

- C# gotcha answer

- Building a LINQ query programmatically without local variables tricking me

The simple fix is to copy the variable first:

List<string> keys = FillKeys()
foreach (string key in keys){
    string copy = key;
    q = q.Where(c => c.Company.Name.Contains(copy));
}

Problem

I have a List containing several keywords. I foreach through them building my linq query with them like so (boiled down to remove the code noise): ``` List<string> keys = FillKeys() foreach (string key in keys){ q = q.Where(c => c.Company.Name.Contains(key)); } ``` When I now make my keys contain 2 keys that return results seperatly, but can never occure together (every item in q is either "xyz" or "123", never "123" AND "xyz"), I still get results. The resultset is then the same as the last string it got to. I had a look at the linq query and it appears it creates the correct sql, but it replaces @p1 AND @p2 both by the same (last itterated) value. What am I doing wrong?

Original source

Related problems