2010-08-30 85 views
1

我把其他帖子的一些信息拼凑在一起,但我被卡住了。将匿名类型转换为强类型以进行分组查询?

第一部分正常工作。基本上我使用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 

现在不是有很多用的dupelicate代码三个功能,如果REPORTTYPE是我司要运行该查询,并把它放到设定的结果。

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) 

这是刚刚分组和总结的相同数据。但它作为一个匿名类型来完成。我试图做“用{.DIVISION_CODE = DIVISION_CODE,...}选择新的tblBud_CONNECTs”,但它给了我“显式构造实体类型tblBud_CONNECTs不被允许”的错误。

我该怎么做我想要的?看来我应该能够。谢谢。

回答

1

为了完整起见,我会回答我自己的问题。

首先我创建了一个类来保存结果。

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

解决方案是创建一个Division实例的集合,并使用'results'来填充这个集合。
然后,您可以使用Attach方法为这些实体启用更改跟踪。

+0

你能详细解释一下吗?我不明白。 – 2010-08-31 15:51:53

+0

尝试下面的代码: Dim list As New List(Of Division) 对于结果中的每个元素 Dim div As New Division With {.DivisionCode = element.DIVISION_CODE,...,.ABAmt = element.ABAmt} list.Add(div) Next DataContextInstance.Divisions.AttachAll(list) – Devart 2010-09-01 11:04:24

+0

感谢您的回答,但我从来没有完全理解您想说什么。我最终使用了一种不同的方法,我添加了这个方法来回答这个问题。 – 2010-09-10 14:17:51