Вполне вероятно, вы используете старую версию C#, в C# 5 (поставляется с Visual Studio 2013), они изменили поведение foreach
. В C# 4 a
в g => (g.ACode == Convert.ToInt16(a))
будет последним значением foreach
при оценке lazely, в C# 5 и новее оно всегда будет текущим значением.
Чтобы получить поведение C# 5, вам просто нужно объявить дополнительную переменную внутри области цикла foreach и использовать ее в захвате.
IEnumerable<Geo> geos = null;
foreach (string a in values)
{
string b = a;
if (geos == null)
geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(b)));
else
geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(b))));
}
Если вам интересно вещь, что изменилось в C# 4 и ниже исходного кода переводится, чтобы
IEnumerable<Geo> geos = null;
using(IEnumerator<string> enumerator = values.GetEnumerator())
{
string a;
while(enumerator.MoveNext())
{
a = enumerator.Current;
if (geos == null)
geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
else
geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
}
}
В C# 5 и более поздние версии он переводится на
IEnumerable<Geo> geos = null;
using(IEnumerator<string> enumerator = values.GetEnumerator())
{
while(enumerator.MoveNext())
{
string a = enumerator.Current;
if (geos == null)
geos = entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a)));
else
geos = geos.Concat(entities.Geos.Where(g => (g.ACode == Convert.ToInt16(a))));
}
}
Выполняя string b = a;
в C# 4, мы воссоздаем это поведение декларации, находящейся внутри while петля.
Я бы проверил, что 'entities.Geos.Where (g => (g.ACode == Convert.ToInt16 (a)))' фактически возвращает строки для 1 и 2. Также, какая версия Visual Studio вы используя, beahvior переменных захватов в цикле foreach, измененных в 2013 году –
@Scott Chamberlain возвращает значения как для 1, так и для 2, я использую VS 2010 –