开发者

Convert anonymous type to strong type for grouping query?

I've pieced together some information from other posts but I'm stuck.

The first part works fine. Basically I query the database using LINQ and then I loop through the results generating a report.

Dim results As System.Linq.IQueryable(Of Bud900Reports.tblBud_CONNECT)

If options.Type = reportType.Organization Then
        results = From p In db.tblBud_CONNECTs _
                Where p.TableOldName = "tblFY" & options.FiscalYear And p.DEPTID = options.GroupFilter _
                Order By p.SOURCE_CODE, p.ROW_CODE_903 _
                Select p



    ElseIf options.Type = reportType.Division Then
        'Here is my problem line

End If

For each result in results
    'loop through code generating report
Next

Now instead of having three function with alot of dupelicate code, if the reportType is Division I want to run this query and put it into the results set.

results = (From p In db.tblBud_CONNECTs _
                  Where p.TableOldName = "tblFY" & options.FiscalYear And p.DIVISION_CODE = options.GroupFilter _
                  Group p By p.DIVISION_CODE, p.SOURCE_CODE, p.ROW_CODE_903 Into _
                  OrigEft = Sum(p.OrigEft), OrigAmt = Sum(p.OrigAmt), ABEft = Sum(p.ABEft), ABAmt = Sum(p.ABAmt) _
                  Order By DIVISION_CODE, SOURCE_CODE, ROW_CODE_903 _
                  Select DIVISION_CODE, SOURCE_CODE, ROW_CODE_903, OrigEft, OrigAmt, ABEft, ABAmt)

It's the same data just grouped and summed up. But it comes through as an anonymous type. I tried to do "select new tblBud_CONNECTs with {.DIVISION_CODE = DIVISION_CODE, ...}" but it gave me the error of "Explicit construction of entity type tblBud_CONNECTs is not allowed".

How can I do what I want? It开发者_如何学运维 seems that I should be able to. Thanks.


For completeness I'll answer my own question.

First I created a class to hold the results.

Private Class results
    Private mDivCode As String
    Public Property DivCode() As String
        Get
            Return mDivCode

        End Get
        Set(ByVal value As String)
            mDivCode = value
        End Set
    End Property


    Private mSourceCode As Short
    Public Property SourceCode() As Short
        Get
            Return mSourceCode
        End Get
        Set(ByVal value As Short)
            mSourceCode = value
        End Set
    End Property


    Private mRowCode As Short
    Public Property RowCode() As Short
        Get
            Return mRowCode
        End Get
        Set(ByVal value As Short)
            mRowCode = value
        End Set
    End Property


    Private mOrigEft As Decimal
    Public Property OrigEft() As Decimal
        Get
            Return mOrigEft
        End Get
        Set(ByVal value As Decimal)
            mOrigEft = value
        End Set
    End Property


    Private mOrigAmt As Decimal
    Public Property OrigAmt() As Decimal
        Get
            Return mOrigAmt
        End Get
        Set(ByVal value As Decimal)
            mOrigAmt = value
        End Set
    End Property


    Private mABEft As Decimal
    Public Property ABEft() As Decimal
        Get
            Return mABEft
        End Get
        Set(ByVal value As Decimal)
            mABEft = value
        End Set
    End Property


    Private mABAmt As Decimal
    Public Property ABAmt() As Decimal
        Get
            Return mABAmt
        End Get
        Set(ByVal value As Decimal)
            mABAmt = value
        End Set
    End Property

End Class

Then I set a variable to hold the results.

Dim results As System.Linq.IQueryable(Of results)

Then I made my linq query fill up the results like so.

results = (From p In db.tblBud_CONNECTs _
                Where p.TableOldName = "tblFY" & options.FiscalYear And p.DEPTID = options.GroupFilter _
                Order By p.SOURCE_CODE, p.ROW_CODE_903 _
                Select New results With {.DivCode = p.DIVISION_CODE, .SourceCode = p.SOURCE_CODE.Value, .RowCode = p.ROW_CODE_903.Value, _
                                         .OrigEft = p.OrigEft.Value, .OrigAmt = p.OrigAmt.Value, .ABEft = p.ABEft.Value, .ABAmt = p.ABAmt.Value})

That's how I ended up doing what I wanted.


The solution is to create a collection of the Division instances and populate this collection using 'results'.
Then you can use the Attach method to enable change tracking for these entities.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜