将Entity Framework查询结果带到嵌套字典的有效方法?

时间:2011-05-23 20:52:18

标签: .net entity-framework dictionary

我在如何解决这个问题上遇到了麻烦。我正在编写一个函数,我希望返回类型为:

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

任何人都可以帮助我吗?

编辑:我愿意使用不同的返回类型,只要它以类似的方式嵌套和分组数据。

学期根本不是存储在数据库中的对象。它只是我根据日期填充的静态对象,所以我不能用它来查询。我只是在数据库中有我的文章,它有一个与之关联的startdate,并且使用该startdate我可以计算它所在的学期。

编辑:尝试了以下的usr解决方案:

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 个答案:

答案 0 :(得分:2)

我将在伪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

请注意,按功能分组允许两个参数不是一个。您不仅可以指定分组列,还可以指定要在每个组中使用的值。在这种情况下,我指定按月分组不仅是文章,而且还保留他们的学期。 Jope这有帮助。