【问题标题】:grouping in LINQ queryLINQ 查询中的分组
【发布时间】:2014-04-15 16:47:48
【问题描述】:

给定一张包含数千行数据的表格,如下面的示例所示

Id  Date        SymbolId    NumOccs HighProjection  LowProjection   ProjectionTypeId
1   2014-04-09    28           45        1.0765        1.0519            1
2   2014-04-10    5            44        60.23         58.03             1
3   2014-04-11    29           77        1.026         1.0153            1

和一个定义为的类

Public Class ProjectionPerformance
    Public symbolId As Integer
    Public Name as String
    Public Date as String       
    Public ActualRange as Decimal
End Class

我正在尝试为每个 symbolId 返回以下内容;
symbolId(来自此表)
符号名称(来自符号表)
实际范围(高投影 - 低投影)

这可以在一个查询中完成吗,因为我本质上需要一个 Dictionary(Of Integer, List(Of ProjectionPerformance)),其中整数是 symbolId,而 List 是从查询中生成的?

更新:
为了更清楚一点,这是我到目前为止所做的,但包含两个 LINQ 迭代

Public Shared Function GetRangeProjectionPerformance(Optional daysToRetrieve As Integer = 100) As Dictionary(Of Integer, List(Of ProjectionPerformance))

Dim todaysDate As Date = DateTime.Now.Date
Dim lookbackDate As Date = todaysDate.AddDays(daysToRetrieve * -1)
Dim temp As New Dictionary(Of Integer, List(Of ProjectionPerformance))


Using ctx As New ProjectionsEntities()
    Dim query = (From d In ctx.projections
                 Where d.SymbolId <= 42 AndAlso d.Date >= lookbackDate
                 Join t In ctx.symbols On d.SymbolId Equals t.Id
                 Let actualRange = d.HighProjection - d.LowProjection
                 Select New With {
                    d.Date,
                    d.SymbolId,
                    t.Name,
                    actualRange}).GroupBy(Function(o) o.SymbolId).ToDictionary(Function(p) p.Key)

    For Each itm In query
        Dim rpp As New ProjectionPerformance
        Dim rppList As New List(Of ProjectionPerformance)
        If itm.Value.Count > 0 Then
            For x As Integer = 0 To itm.Value.Count - 1
                Dim bb As Integer = Convert.ToInt32(itm.Value(x).SymbolId)
                With rpp
                    .SymbolId = bb
                    .ProjectionDate = itm.Value(x).Date.ToString()
                    .Name = itm.Value(x).Name
                    .ProjectedRange = itm.Value(x).actualRange
                End With
                rppList.Add(rpp)
            Next
        End If

        temp.Add(itm.Key, rppList)
    Next
End Using
Return temp

结束函数

【问题讨论】:

    标签: vb.net linq entity-framework


    【解决方案1】:

    我将用 C# 来回答,但我想你无论如何都会明白它的要点。基本上,您可以按SymbolId 分组,构建您的对象图,然后使用ToDictionary 使用Key 创建dictionary。

    var result = (From d In _projectionEntities.projections
                     Where d.SymbolId <= 42
                     group d by d.SymbolId into g
                     select new {
                             SymbolId = g.Key,
                               ProjectionPerformances = 
                                           g.Select(gg=>new ProjectionPerformance{
                                                       SymbolId = gg.SymbolId,
                                                       Name = gg.Symbol.Name,
                                                       rpDate = gg.Date.ToString(),
                                                       ActualRange = gg.HighProjection - gg.LowProjection
                                                      })
                          .ToDictionary(g=>g.SymbolId);
    

    【讨论】:

    • 好吧,看起来不错。不适转换为 vb.Net
    • 您的回答帮助我想出了正确的答案,而另一个问题的另一张海报提供了一点帮助。在您的版本和我的原始版本中,查询给了我一个转换为十进制错误。但我现在可以走了。 TY
    【解决方案2】:

    试试

    Dim Result = (From d In _ProjectionEntities.projections
                 Join t In _projectionEntities.symbols On d.SymbolId Equals t.Id
                 Where d.SymbolId <= 42
                 Select New With {.SymbolID = d.SymbolID
                                  .Date = d.Date
                                  .Name = t.Name
                                  .ActualRange = d.HighProjection - d.LowProjection})
    

    【讨论】:

    • 不回答帖子中提出的问题。我已经可以查询课程的全部结果了。问题是在一个 LINQ 查询中将其放入字典中。
    猜你喜欢
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多