Вложенный запрос с использованием Linq с ToDictionary - PullRequest
1 голос
/ 25 августа 2011

У меня проблемы с этим запросом, использующим Entity Framework 4:

List<SomeResult> test = (from a in _entities.TableA
                         select new SomeResult
                         {
                            TestB = a.TableB.Name,
                            TestCDict = a.TableC.ToDictionary(x => x.SomeKey, x => x.SomeValue)
                          }).ToList();

выдает эту ошибку:

"Невозможно сравнить элементы типа 'System.Data.Objects.DataClasses.EntityCollection`1'. Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей."

Как мне повторить этот запрос, чтобы он работал? из a в _entities.TableA из c в a.TableC .... ToDictionary (..?

/ Ласс

1 Ответ

3 голосов
/ 25 августа 2011

Проблема в том, что вы делаете запрос к базе данных. И поставщик LINQ, который вы используете, на самом деле не выполняет ни одной из написанных вами операций. Он только пытается перевести весь ваш код в Select в запрос к базе данных. Очевидно, что он не может анализировать действительно сложные данные, как вы написали с помощью ToDictionary (). Вы можете просто загрузить все данные из сущностей в память, а затем выполнить всю работу со словарем. Тогда ваш код будет фактически выполнен и должен работать. Как:

List<SomeResult> test = from a in (from aa in _entities.TableA).AsEnumerable())
                         select new SomeResult
                         {
                            TestB = a.TableB.Name,
                            TestCDict = a.TableC.ToDictionary(x => x.SomeKey, x => x.SomeValue)
                          }).ToList();

Конечно, вы можете использовать фильтрацию на стороне БД во внутреннем запросе (до AsEnumerable ()), чтобы сузить объем данных, загружаемых в память.

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