我在如何解决这个问题上遇到了麻烦。我正在编写一个函数,我希望返回类型为:
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.
它似乎真的很讨厌您在查询中计算的内容,但不在原始数据集中。
答案 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这有帮助。