Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

convert query result to dictionary in vb.net

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

 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?

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
like image 791
dinotom Avatar asked Apr 14 '14 19:04

dinotom


People also ask

How do you empty a dictionary in VB net?

To create an empty dictionary, just go New Dictionary().


1 Answers

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

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())
like image 78
Markus Avatar answered Nov 15 '22 08:11

Markus