Эффективный способ перенести результаты запроса Entity Framework в Nested Dictionary? - PullRequest
0 голосов
/ 24 мая 2011

Я поражен тем, как подойти к этой проблеме.Я пишу функцию, в которой я хочу, чтобы тип возвращаемого значения был:

Dictionary(Of String, Dictionary(Of Integer, List(Of Article)))

Я получил список статей, которые я хотел сгруппировать по названию семестра, затем по значению месяца, затем по спискустатьи, которые вписываются в это.

До сих пор я был в состоянии сделать это:

Dim lectures As New Dictionary(Of Integer, List(Of Article))
        lectures = (From Articles In db.Articles _
           Order By Articles.StartDate.Value.Month Ascending _
           Where Articles.ArtType = ArticleConstants.lecturesTypeId _
           Group By Articles.StartDate.Value.Month _
           Into Group).AsEnumerable().Reverse.ToDictionary(Function(x) x.Month, Function(x) x.Group.ToList())

И это дает мне внутренний словарь, однако я не уверен, куда идти дальше.Поскольку я храню месяц только как целое число, я не могу использовать его, чтобы надежно определить семестр (так как семестр - «Осень 2011»).Я также не могу получить полную дату, потому что тогда моя группировка не будет работать.

У меня есть служба для получения семестра на основе startDate Статьи, которая выглядит следующим образом:

SemesterService.getSemester(Article.StartDate)

Но опять же я не уверен, как это применить.Я думаю, может быть, я просто начну со всех статей в заданном диапазоне дат, а затем вручную заполню как внутренние, так и внешние словари, основываясь на некоторой логике, которая повторяет эти результаты, но я никогда раньше не делал что-то такое сложное, и у меня возникают проблемы.

Итак, в конце я получу набор результатов, который выглядит следующим образом:

Fall 2011 (outer dictionary key)
    1 (for January, inner dictionary key)
        Article 1
        Article 2 (list of articles, inner dictionary value)
        Article 3

Может кто-нибудь мне помочь?

РЕДАКТИРОВАТЬ: Я открыт для использования другого возвращаемого типа, если он вложен и группирует данные одинаковым образом.

Семестр НЕ является объектом, хранящимся в базе данных вообще.Это просто статический объект, который я заполняю на основе даты, поэтому я не могу сделать запрос по этому.У меня есть только мои статьи в базе данных, с которой связана начальная дата, и, используя эту начальную дату, я могу рассчитать семестр, в котором он находится.

Редактировать: Решение для пробной версии ниже:

From Articles In db.Articles _
   Order By Articles.StartDate.Value.Month Ascending _
   Where Articles.ArtType = ArticleConstants.lecturesTypeId _
   Group New With { Articles, .Semester = SemesterService.getSemester(Articles.StartDate) } By Articles.StartDate.Value.Month _
   Into Group

После этого я получаю сообщение об ошибке: LINQ to Entities does not recognize the method 'Semester getSemester(System.DateTime)' method, and this method cannot be translated into a store expression.

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

1 Ответ

2 голосов
/ 24 мая 2011

Я отвечу псевдо-C #:

from s in semesters
group s by s.Name into g
select new {
 SemName = g.Key,
 MonthsItems = (from y in g group y by y.Month into g2 select new { Month = g2.Key, ... }
}

Вот как вы делаете вложенную группировку. Тем не мение! Это приведет к удручающе плохому результату. Обязательно замените «semesters» на «semesters.AsEnumerable ()», чтобы на клиенте была оценена вложенная группировка. SQL не имеет возможности возвращать деревья, поэтому это нельзя сделать на сервере. Надеюсь, что это поможет, если неясно, прокомментируйте, и я уточню.

В качестве альтернативы сделайте следующее:

from s in semesters
group s by new { s.Name, s.Month }

Таким образом, вы можете полностью выполнить на сервере.

Редактировать: Из комментариев я могу сказать, что проблема в чем-то другом.

       From Articles In db.Articles _
       Order By Articles.StartDate.Value.Month Ascending _
       Where Articles.ArtType = ArticleConstants.lecturesTypeId _
       Group new { Articles, Semester = SemesterService.getSemester(Articles.StartDate) } By Articles.StartDate.Value.Month _
       Into Group

Обратите внимание, что функция группирования позволяет иметь два параметра, а не один. Вы можете указать не только столбцы группировки, но и значения, которые вы хотите иметь в каждой группе. В этом случае я указывал группировать по месяцам не только статьи, но и сохранять их семестры. Джоп, это помогает.

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