ASP.NET Ошибка LINQ Не удается создать результат запроса типа ‘System.Коллекции.Generic.List`1[System.Int32]’

#c# #asp.net-mvc #linq #dictionary

#c# #asp.net-mvc #linq #словарь

Вопрос:

Я пытаюсь создать Dictionary<string, List<int>> через оператор Linq

Это выдает следующую ошибку: не удается создать результат запроса типа ‘System.Коллекции.Generic.List`1[System.Int32]’

         var output = (
                    from e in EDC.Energideklarationer_As
                    where MunicipalityName.Contains(e.Municipality)
                    group e by e.Municipality into g
                    select new
                    {
                        Municipality = g.Key,

                        listan = new List<int>()
                        {
                        g.Count(e => e.H== "El"),
                        g.Count(e => e.H== "Eldningsolja"),
                        g.Count(e => e.H== "Flis"),
                        g.Count(e => e.H== "Markvarmepump"),
                        g.Count(e => e.H== "Ved")
                        }
                    }
            ).ToDictionary(x => x.Municipality, x=> x.listan);
 

Комментарии:

1. Можете ли вы попробовать разделить select и ToDictionary() на 2 строки и сообщить нам, если ошибка все еще возникает? И если это так, пожалуйста, сообщите нам, какая строка вызывает ошибку.

2. Спасибо за ответ. Не уверен, что вы имеете в виду. Можете ли вы показать мне пример?

3. var temp = from e in... , тогда var output = temp.ToDictionary(x => x.Municipality, x=> x.listan); таким образом мы можем узнать, какая часть вашего linq действительно вызывает проблему.

4. Он жалуется на . ToDictionary() С той же ошибкой: не удается создать результат запроса типа ‘System. Коллекции. Generic.List`1[System.Int32]’.

5. EDC.Energideklarationer_As Случается, что IQueryable

Ответ №1:

Я предполагаю, что вы используете какую-то библиотеку ORM, и EDC.Energideklarationer_As объект IQueryable реализован в этом ORM. Происходит то, что эта библиотека пытается сгенерировать запрос (возможно, SQL-запрос, в зависимости от того, какую библиотеку вы используете) к базовому источнику данных из вашего запроса LINQ.

Некоторые выражения не поддерживаются в некоторых ORM — например, Entity Framework не будет обрабатывать select new int[] { ... } , но будет обрабатывать select new List<int> { ... } . Похоже, что используемая вами библиотека не поддерживает создание нового списка в запросе. И возникает исключение ToDictionary , потому что именно там создается экземпляр результата, и LINQ преобразуется.

Попробуйте заменить список:

                 listan = new List<int>()
                {
                    g.Count(e => e.H== "El"),
                    g.Count(e => e.H== "Eldningsolja"),
                    g.Count(e => e.H== "Flis"),
                    g.Count(e => e.H== "Markvarmepump"),
                    g.Count(e => e.H== "Ved")
                }
 

с другим анонимным типом:

                 listan = new 
                {
                    El = g.Count(e => e.H== "El"),
                    Eldningsolja = g.Count(e => e.H== "Eldningsolja"),
                    Flis = g.Count(e => e.H== "Flis"),
                    Markvarmepump = g.Count(e => e.H== "Markvarmepump"),
                    Ved = g.Count(e => e.H== "Ved")
                }