Я написал следующий LINQ запрос:
IQueryable<ISOCountry> entries =
(from e in competitorRepository.Competitors
join c in countries on e.countryID equals c.isoCountryCode
where !e.Deleted
orderby c.isoCountryCode
select new ISOCountry() { isoCountryCode = e.countryID, Name = c.Name }
).Distinct();
Цель состоит в том, чтобы получить список стран, представленных конкурентами, найденными в системе. 'country' - это массив объектов ISOCountry, явно созданных и возвращенных как IQueryable (ISOCountry - это объект только из двух строк, isoCountryCode и Name). Конкуренты - это IQueryable , который связан с таблицей базы данных через LINQ to SQL , хотя я создал объекты с нуля и использовал декораторы отображения данных LINQ.
По какой-то причине этот запрос вызывает переполнение стека, когда система пытается его выполнить. Я понятия не имею, почему, я попытался обрезать Distinct, возвращая анонимный тип двух строк, используя 'select c', но все это приводит к переполнению. Значение e.CountryID заполняется из раскрывающегося списка, который сам по себе был заполнен из IQueryable , поэтому я знаю, что значения являются подходящими, но даже если нет, я не ожидал бы переполнения стека.
Почему происходит переполнение или почему оно может происходить?
По запросу код для ISOCountry:
public class ISOCountry
{
public string isoCountryCode { get; set; }
public string Name { get; set; }
}
Он инициализируется из статического служебного класса следующим образом:
public static IQueryable<ISOCountry> GetCountryCodes()
{
// ISO 3166-1 country names and codes from http://opencountrycodes.appspot.com/javascript
ISOCountry[] countries = new ISOCountry[] {
new ISOCountry { isoCountryCode= "AF", Name= "Afghanistan"},
new ISOCountry { isoCountryCode= "AX", Name= "Aland Islands"},
new ISOCountry { isoCountryCode= "AL", Name= "Albania"},
new ISOCountry { isoCountryCode= "DZ", Name= "Algeria"},
new ISOCountry { isoCountryCode= "AS", Name= "American Samoa"},
...
new ISOCountry { isoCountryCode= "YE", Name= "Yemen"},
new ISOCountry { isoCountryCode= "ZM", Name= "Zambia"},
new ISOCountry { isoCountryCode = "ZW", Name = "Zimbabwe"}
};
return countries.AsQueryable();
}
<Ч />
Как я, наконец, заставил его работать, см. Ниже ... Мне все еще интересно, что конкретно не так с исходным запросом, я уверен, что я делал подобные вещи раньше.
IList<string> entries = competitorRepository.Competitors.Select(c=>c.CountryID).Distinct().ToList();
IList<ISOCountry> countries = Address.GetCountryCodes().Where(a => entries.Contains(a.isoCountryCode)).ToList();