#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")
}