Entityset превращается в IEnumerable на ранней стадии - PullRequest
1 голос
/ 08 июля 2011

У меня следующая проблема: я хочу отобразить Билеты из системы поддержки в аккуратном обзоре. Я также хочу отображать сводные данные, например, группировки по приоритетам и категориям. Кроме того, те же данные должны быть превращены в документ .pdf.

Я получаю данные в несколько шагов. Шаг первый - необработанные данные, которые являются основой для .pdf, резюме и фактического обзора. Таким образом, я гарантирую, что они принимают те же данные. После создания .pdf я непосредственно прочитал данные. Резюме составлены путем сглаживания данных. Обзор создается путем извлечения страницы из 25 записей из данных и размещения полей в сетке.

Проблема в

IQueryable<RelationHoursTicketItem> HoursByTicket = 
            from Ticket t in allTickets
            let hours = t.Bezoekrapport.Urens.
                Where(h =>
                    (dateFrom == null || h.Datum >= dateFrom)
                    && (dateTo == null || h.Datum <= dateTo)
                    && h.Uren1 > 0)
            select new RelationHoursTicketItem
             {
                 Date = t.DatumCreatie,
                 DateSolved = new DateTime(2012, 11, 11),
                 Ticket = t,
                 Relatie = t.Relatie,
                 TicketNr = t.Id,
                 TicketName = t.Titel,
                 TicketCategorie = t.TicketCategorie,
                 TicketPriority = t.TicketPrioriteit,
                 TicketRemark = t.TicketOpmerkings.SingleOrDefault(tr => tr.IsOplossing)
             };

Проблема в TicketRemark. Как только я выполняю данные, я получаю десятки подзапросов, поскольку TicketOpmerkings - голландский для TicketRemarks - извлекается один за другим . Первоначально предполагалось создать IQueryable, который послужил бы основой для всех остальных запросов. Для этого я проделал большую работу, создавая собственные выражения для вычисления определенных полей, которые я вырезал из этого примера.

Каков наилучший из возможных подходов? Написание выражений для всех этих ссылок, таких как t.TicketOpmerkingen? Это позволит удалить некоторые из лучших функциональных возможностей LINQ. Решения, которые я видел до сих пор, включают ручное создание выражений, но затем я могу также отказаться от этого подхода и сделать несколько запросов, каждый для своего конкретного назначения. Затем я оставил аккуратный «многоуровневый» подход LINQ и IQueryable.

У кого-нибудь есть опыт?

1 Ответ

2 голосов
/ 08 июля 2011

То, что вы испытываете, известно как n + 1 проблема .Это происходит, когда вы извлекаете объекты, используя ORM, используя отложенную / отложенную загрузку .

Вы извлекаете объекты, связанные с другими объектами.Когда вы пытаетесь перейти ко второму набору объектов, ORM / Framework в настоящее время не загружает объект.Поэтому он запрашивает у вас сущность, позволяя вам перемещаться по назначению.

Существует несколько способов решения этой проблемы.Вот несколько статей, касающихся параметров загрузки данных:

Если вы используете Linq to Sql:

MSDN для DataLoadOptions

Небольшая статьяобъяснение использования DataLoadOptions

для Entity Framework:

MSDN для ObjectQuery (Of T) .Include

Статьяописание техник энергичной загрузки

Надеюсь, это поможет.

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