2016-02-01 1 views
0

Я использую Entity Framework 7 Code FirstCS0266 Не может неявно преобразовать тип «System.Collections.Generic.List <System.Linq.IGrouping к„System.Collections.Generic.List“

У меня есть функция, которая должна возвратов список стран (ids, Names), связанных с пользователем. Пользователь не связан напрямую со страной, но связан через город. Город связан с государством. Государство связано со страной.

Я решил использовать GroupBy для получения списка стран.

public async Task<IEnumerable<Country>> Search(int userId) 
{ 
    var table = await _db.Cities 
     .Include(ci => ci.States.Country) 
     .Select(ci => ci.States.Country) 
     .OrderBy(co => co.CountryName) 
     .GroupBy(co=>co.pk_CountryId) 
     .ToListAsync() 
     ; 
     return table; 

} 

Однако я получаю ошибку:

CS0266 Cannot implicitly convert type ' System.Collections.Generic.List <System.Linq.IGrouping> to ' System.Collections.Generic.List '

  1. Как вернуть переменную IEnumerable<Country>, как это то, что принимающий код ожидает, т.е. список стран?
  2. Я правильно делаю свою группировку?
  3. Для выполнения Я предполагаю, что группировка лучше, чем отличаются или содержит
+0

Удалить группу ... –

+0

Я могу использовать отличную, но всегда продуманную группировку лучше для производительности – devc2

ответ

2

Если вы хотите иметь различные страны, вы можете использовать отборное затем, чтобы выбрать первую страну в каждом IGrouping<int,Country>:

public async Task<IEnumerable<Country>> Search(int userId) 
{ 
return await _db.Cities 
    .Include(ci => ci.States.Country) 
    .Select(ci => ci.States.Country) 
    .OrderBy(co => co.CountryName) 
    .GroupBy(co=>co.pk_CountryId) 
    .Select(co => co.FirstOrDefault()) 
    .ToListAsync(); 
} 

Кроме того, здесь мало места, Include. Желательная загрузка стран была бы полезна только в том случае, если вы должны были вернуть States и хотите, чтобы его имущество было заполнено Country. Select гарантирует, что вы захватываете Country, вы даже не извлекаете состояния из базы данных.

+0

Вы действительно писали 'FirstOrDefault()', а не только 'FirstOrDefault'? Если «co» в select является 'IGrouping ', который должен компилироваться. 'FirstOrDefault()' - метод, а не свойство. –

+0

Пропущенные скобки. Однако теперь я получаю ошибку времени выполнения 'InvalidOperationException: Sequence содержит более одного элемента' – devc2

+0

@ devc2, что, вероятно, является ошибкой, вызванной' Single' или 'SingleOrDefault()' в вашем коде и не относящейся к этому коду. –

Смежные вопросы

 Смежные вопросы