在 vb.net 中将查询结果转换为字典

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/23068978/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 17:22:42  来源:igfitidea点击:

convert query result to dictionary in vb.net

vb.netlinqdictionary

提问by dinotom

What is the proper syntax for .ToDictionary to return the following as a Dictionary(Of String, String) where ShortDesc is the key and CurrentFrontSymbol is the value

.ToDictionary 将以下内容作为 Dictionary(Of String, String) 返回的正确语法是什么,其中 ShortDesc 是键,CurrentFrontSymbol 是值

 Dim dicQuery As Dictionary(Of String, String) = (From d In toolkitEntities.currentfrontcommoditysymbols
                                                     Select d.ShortDesc, d.CurrentFrontSymbol)

Update

更新

And can the following functions query and following For Each loop become one LINQ query?

并且以下函数可以查询和跟随 For Each 循环成为一个 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
End Function

回答by Markus

As you do not have a special projection in the select, you can just call ToDictionaryon the collection. The first lambda expression retrieves the key, the second one the value.

由于您在选择中没有特殊投影,您可以调用ToDictionary集合。第一个 lambda 表达式检索键,第二个表达式检索值。

Dim dicQuery = toolkitEntities.currentfrontcommoditysymbols.ToDictionary( _
                   Function(x) x.ShortDesc, _
                   Function(y) y.CurrentFrontSymbol)

As for your update: the following query should get you the desired result:

至于您的更新:以下查询应该会得到您想要的结果:

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, 
                          Function(x) x.Select(Function(y) New ProjectionPerformance() With {
                              .SymbolId = Convert.ToInt32(y.SymbolId), 
                              .ProjectionDate = y.Date.ToString(), 
                              .Name = y.Name, 
                              .ProjectedRange = y.actualRange
                          }).ToList())