В этом примере Select().GroupBy().ToList()
по существу возвращает список списков. Список верхнего уровня содержит все группы, созданные GroupBy (), в то время как второй уровень lists содержит строки для каждой группы, возвращаемой методом Select (). Это объекты анонимного типа, которые полностью отличаются от MyDbTableEntity
Ни список групп, ни анонимные типизированные объекты не конвертируются в ваш тип MyDbTableEntity. Чтобы продемонстрировать, что я имею в виду, если вы удалите оператор Select () (и, следовательно, анонимные типы), вы можете изменить последнюю строку на следующую, и она будет работать:
foreach(var items in groupedItemList) finalEntries.AddRange(items);
Конечно, это в первую очередь противоречит цели группировки, но демонстрирует один аспект того, почему оригинальный код не работал. Второй аспект был продемонстрирован удалением оператора Select ()
Вот пример того, что я имею в виду:
class Person {
public string FirstName;
public string LastName;
public Person(string firstName, string lastName) {
FirstName = firstName;
LastName = lastName;
}
}
Person[] people = {
new Person("Fred", "Bloggs"),
new Person("Linda", "Bloggs"),
new Person("Joe", "Bloe"),
new Person("Jane", "Bloe"),
new Person("Fred", "Flinstone")};
public void Test() {
List<Person> list = new List<Person>();
// This works
var peopleGroupedByLastName = people.GroupBy(k => k.LastName).ToList();
foreach(var grp in peopleGroupedByLastName) {
// The grp var holds a list of Person objects, each with the same last name
list.AddRange(grp); // Pointless, but works
}
// The following will not even compile because the anonymous typed objects are
// not compatible with Person objects, despite having exactly the same fields
var peopleGroupedByLastName2 = people
.Select(k => new { FirstName = k.FirstName, LastName = k.LastName })
.GroupBy(k => k.LastName)
.ToList();
foreach(var grp in peopleGroupedByLastName2)
list.AddRange(grp); // Not "Person" objects
}