<p>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):</p>

<pre><code>List&lt;string&gt; keys = FillKeys()
foreach (string key in keys){
    q = q.Where(c =&gt; c.Company.Name.Contains(key));
}
</code></pre>

<p>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.</p>

<p>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.</p>

<p>What am I doing wrong?</p>

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));
}
```
```