2012-10-13 178 views
2

您好,我需要動態linq查詢,它已在vb.net中分組。Linq Dynamic Group By

我的查詢如下。

在第一個查詢我需要按兩列分組,但在第二我需要由一列組。它取決於用戶如何看報告。

如何根據用戶選擇在運行時產生這些查詢?

在此先感謝。

Dim query = From r In dtString.AsEnumerable 
     Group r By Key0 = r.Field(Of String)("country"), 
        Key1 = r.Field(Of String)("region") Into Group 
     Select Key0, Key1, 
       DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")), 
       CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit")) 


Dim query = From r In dtString.AsEnumerable 
     Group r By Key0 = r.Field(Of String)("country") Into Group 
     Select Key0 
       DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")), 
       CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit")) 
+1

我不明白,你爲什麼不用'If..Else'? –

+0

我用select case。但關鍵領域的數量根據用戶的選擇而改變,它可以是1或7.所以我不得不重新編碼同樣的東西7次。如果一天的報告關鍵字段數增加到100,這將不會動態: – user1645334

回答

1

你可以從你的Select條款看,你的兩個查詢的結果都沒有(匿名)類型兼容。您最簡單的解決方案可能是將您的第二個查詢更改爲具有第二個冗餘或常量組密鑰的內容。

E.g.

query = From r In dtString.AsEnumerable 
    Group r By Key0 = r.Field(Of String)("country"), 
       Key1 = r.Field(Of String)("country") Into Group 
    Select Key0, Key1, 
      DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")), 
      CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit")) 

query = From r In dtString.AsEnumerable 
    Group r By Key0 = r.Field(Of String)("country"), 
       Key1 = "ignored" Into Group 
    Select Key0, Key1, 
      DebitTotal = Group.Sum(Function(r) r.Field(Of Decimal)("debit")), 
      CreditTotal = Group.Sum(Function(r) r.Field(Of Decimal)("credit")) 

(未經測試)

那麼你必須調整你的結果顯示在需要時忽略key1

+1

謝謝,我想最有效的解決方案就是您的第一個示例。 – user1645334