Объявление списка с анонимным типом - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь объявить список, в котором есть анонимный тип. Я попытался присвоить списку значение null, а также попытался присвоить список новому списку объектов, но он показывает ошибку. Есть указатели?

var finalEntries = new List<MyDbTableEntity>();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new { name = k.name.ToString(), data = k.info.ToString() })
                      .GroupBy(k => k.name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

Error

cannot convert from 
'System.Collections.Generic.List<System.Linq.IGrouping<string, <anonymous type: string name, string data>>>' 
to 
'System.Collections.Generic.IEnumerable<MyDbTableEntity>'

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

В этом примере 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
    }
0 голосов
/ 07 июня 2018
var finalEntries = Enumerable.Empty<MyDbTableEntity>()
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

http://rextester.com/KNLMR37736

0 голосов
/ 07 мая 2018

Не работает, потому что у вас есть напечатанный список MyDbTableEntity. Вы не можете добавить другой тип в этот типизированный список. Попробуйте определить правильный тип?

var finalEntries = new List<MyDbTableEntity>();

var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new MyDbTableEntity { Name = k.name.ToString(), Data = k.info.ToString() })
                      .GroupBy(k => k.Name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

или его, или измените его на список object.

var finalEntries = new List<object>();

// not sure about your type
var groupedItemList = _context.MyDbTableEntity
                      .Select(k => new { name = k.name.ToString(), data = k.info.ToString() })
                      .GroupBy(k => k.name)
                      .ToList();

finalEntries.AddRange(groupedItemList);

Importante : Проблема в том, что когда вы потеряете эту область, вы не получите типизированный анонимный тип, я имею в виду, вам нужно будет использовать некоторые артефакты для чтения свойств, например: use reflection для преобразования типа в dictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...