Entity Framework .Include не поддерживает пути с более чем 8 именами, разделенными точками - PullRequest
3 голосов
/ 10 марта 2011

Я открыл ошибку в Microsoft Connect для этого, но нет ответа ( см. Редактирование ниже для их ответа) в течение длительного времени. Итак, вот и все:

При попытке запросить структуру сущностей с ее отношением, используя функцию «Включить» в запросе linq, невозможно запросить отношение по пути, состоящему более чем из 8 шагов (8. Точечных символов в пути). Это мешает мне выполнить некоторые из моих сгенерированных динмическим запросом запросов, которые требуют доступа более чем к этому уровню перенаправления.

Вместо успешного выполнения запроса я получаю следующее исключение:

"Foo.Bar.Baz...(some more path string here)", the current limit of "8" is insufficient.

at System.Data.Common.MultipartIdentifier.IncrementStringCount(String name, String[] ary, Int32& position, String property)
at System.Data.Common.MultipartIdentifier.ParseMultipartIdentifier(String name, String leftQuote, String rightQuote, Char separator, Int32 limit, Boolean removequotes, String property, Boolean ThrowOnEmptyMultipartName)
at System.Data.Objects.Span.ParsePath(String path)
at System.Data.Objects.Span.Include(String path)
at System.Data.Objects.Span.IncludeIn(Span spanToIncludeIn, String pathToInclude) 

Кто-нибудь подумал, почему это так, или как обойти это? Глядя на код (с Reflector) ParsePath, кажется, что они жестко закодировали там магическое число 8 ...

ОБНОВЛЕНИЕ : ответ Microsoft:

Спасибо, что подняли этот вопрос. Мы планируем снять ограничение на количество элементов в пути «Включить» в следующем выпуске.

ОБНОВЛЕНИЕ 2 : Несмотря на приведенный выше ответ Microsoft, ошибка была не исправлена ​​в EF 4.1

ОБНОВЛЕНИЕ 3 : По словам Microsoft, должно быть исправлено в .NET 4.5, но я не проверял предварительный просмотр разработчика, чтобы увидеть, работает ли он.

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011
1 голос
/ 12 марта 2011

Я не видел этого, но вот 2 возможных обходных пути:

  • Прокрутите данные и используйте Load для каждой строки. Обратите внимание, что это создаст вызов к базе данных для каждой строки, поэтому он действительно медленный.

  • Свести данные в представлении и затем выбрать из представления. Это создает много избыточных данных, поэтому больше памяти и сетевого использования.

...