Преобразовать анонимный тип в строгий тип для группировки запросов? - PullRequest
1 голос
/ 30 августа 2010

Я собрал информацию из других постов, но я застрял.

Первая часть работает нормально. По сути, я запрашиваю базу данных, используя LINQ, а затем перебираю результаты, генерируя отчет.

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

Теперь вместо трех функций с большим количеством повторяющегося кода, если reportType имеет тип Division, я хочу выполнить этот запрос и поместить его в набор результатов.

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)

Это те же данные, только что сгруппированные и суммированные. Но это проявляется как анонимный тип. Я попытался сделать "выбрать новые tblBud_CONNECTs с {.DIVISION_CODE = DIVISION_CODE, ...}", но он дал мне ошибку "Явное построение типа сущности tblBud_CONNECTs не разрешено"

Как я могу делать то, что я хочу? Кажется, я должен быть в состоянии. Спасибо.

Ответы [ 2 ]

1 голос
/ 10 сентября 2010

Для полноты я отвечу на свой вопрос.

Сначала я создал класс для хранения результатов.

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

Затем я установил переменную для хранения результатов.

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

Затем я заставил свой запрос linq заполнить результаты примерно так.

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})

Вот так я и закончил делать то, что хотел.

0 голосов
/ 31 августа 2010

Решение состоит в том, чтобы создать коллекцию экземпляров Division и заполнить эту коллекцию, используя «результаты».Затем вы можете использовать метод Attach для включения отслеживания изменений для этих объектов.

...