2012-10-15 147 views
1

這樣的事情最好的辦法是什麼?按列分組然後將每個組添加到數據表中然後將其添加到數據集中

所以這裏是我的DataTable

╔═══════════════╦═══════════════╦═══════════════╗ 
║ Product Name ║ Product Price ║ Product Group ║ 
╠═══════════════╬═══════════════╬═══════════════╣ 
║ Skirt Red  ║   99 ║    1 ║ 
║ Jeans Blue ║   49 ║    2 ║ 
║ Jeans Black ║   49 ║    2 ║ 
║ Skirt Blue ║   99 ║    1 ║ 
║ T-shirt White ║   20 ║    3 ║ 
║ T-shirt Green ║   20 ║    3 ║ 
║ Jeans Grey ║   49 ║    2 ║ 
╚═══════════════╩═══════════════╩═══════════════╝ 

我會組此數據表使用LINQ to產生以下組

Group #1 
    ╔═══════════════╦═══════════════╦ 
    ║ Product Name ║ Product Price ║ 
    ╠═══════════════╬═══════════════╬ 
    ║ Skirt Red  ║   99 ║    
    ║ Skirt Blue ║   99 ║    
    ╚═══════════════╩═══════════════╩ 

Group #2 
     ╔═══════════════╦═══════════════╦ 
     ║ Product Name ║ Product Price ║ 
     ╠═══════════════╬═══════════════╬ 
     ║ Jeans Blue ║   49 ║    
     ║ Jeans Black ║   49 ║ 
     ║ Jeans Grey ║   49 ║ 
     ╚═══════════════╩═══════════════╩ 
Group #3 
     ╔═══════════════╦═══════════════╦ 
     ║ Product Name ║ Product Price ║ 
     ╠═══════════════╬═══════════════╬ 
     ║ T-Shirt White ║   20 ║    
     ║ T-Shirt Green ║   20 ║ 
     ╚═══════════════╩═══════════════╩ 

現在的問題是產品組列

  1. 我如何使用LINQ對產品組列進行分組(012),我如何從結果組中刪除產品組列?
  2. 我怎麼每個組添加到一個單獨的數據表,然後添加所有 表單數據集?(完成)
  3. 假設有,我不希望造成 組中表現出列,我怎麼能隱藏?

這裏是我到目前爲止已經試過

Dim ds As New DataSet 
    Dim query = From r In bookedorders Group By key = r.Field(Of Integer)("productgroup") Into Group 
    For Each grp In query 
     Dim x As New DataTable 
     x = grp.Group.CopyToDataTable() 
     ds.Tables.Add(x) 
    Next 

現在這個工作只是我不知道如何選擇特定列,就像我不希望顯示在結果中的所有列數據表

+0

@channs剛剛添加的問題 – user1570048

回答

1

1.how使用LINQ

這聽起來像你問的是不是技術上稱爲LINQ中的一組產品組列做我組。 linq分組意味着你正在從一列中獲取值並以某種方式(SUM,Average)組合它們,並且爲每個唯一標識符顯示一條記錄。在您的例子,如果你想顯示每組的平均價格,那麼這將需要一個組,但是從你的解釋,它看起來像你只需要3條不同的SELECT語句看起來像:

From r in products where r.groupID = YourControlVariable select r.ProductName, r.ProductPrice

凡YourControlVariable會成爲每個組ID。這個LINQ會給你你列出的三個表,你可以從那裏調用關於LINQ返回的函數的CopyToDataTable函數,並設置一個與該函數的輸出相等的臨時數據表。

2.如何從結果組中刪除產品組列?

通過僅列出要選擇的列,請參閱點1中的linq,您將基本上忽略任何未列出的列。

3.如何將每個組添加到單獨的數據表中,然後將所有表添加到單個數據集?

如果你知道你將要使用的groupID,在循環中完成這將相當簡單。你可以在一個循環內創建一個臨時數據表,並將它設置爲包含來自第1點的linq結果。一旦你有了結果,你就可以命名並將該表添加到數據集中,一旦循環完成,臨時數據表將會但你可以在數據集本身的名稱中引用它們。

4。假設有些列我不想在結果組中顯示,我如何隱藏它們?

請參閱第1/2點。

編輯:

正如你通過在LINQ使得它過於複雜,在你不得不處理匿名類型,如果你想拉出來單獨的屬性描述我想用一組的問題。這是一個簡短的代碼片段,它獲取所有不同的組ID,然後使用LINQ抽出每種類型的所有產品,將它們添加到表中,然後將指定的表添加到數據集中。您可以刪除名稱部分或將其更改爲任何您想要的內容,這並不重要。

Dim ds As New DataSet 
Dim groupIDs = From r in bookedorders Select r.Item("productgroup") Distinct 
for each r in groupIDs 
    Dim query = From t in bookedorders Where t.Item("productgroup") = r select t.Item("ProductName"), t.Item("ProductPrice") 
    If query IsNot Nothing AndAlso query.Any Then 
     Dim tempDT as new DataTable 
     tempDT.Merge(query.CopyToDataTable) 
     tempDt.Name = "ProductID" & r 
     ds.Tables.Add(tempDT) 
    End IF 
Next 

我已經改變了你的例子一點點地使用項目集合,但如果bookedorders是一個DataTable只會工作。

編輯#2:

對這個問題考慮了一下後,上面的例子還是會給予你匿名類型的集合作爲結果。所以,要解決這個問題,你可以改變

Dim query = From t in bookedorders Where t.Item("productgroup") = r select t.Item("ProductName"), t.Item("ProductPrice") 

線看起來像:

​​

,然後裏面的if語句看起來像:

Dim tempDT as new DataTable 
tempDT.Merge(query.CopyToDataTable) 
tempDT.Columns.Remove("GroupID") 
tempDt.Name = "ProductID" & r 
ds.Tables.Add(tempDT) 

同樣,這隻會工作如果您通過數據表進行LINQ並獲得Enumerable(Of DataRow)作爲結果,則更好。

我不習慣VB.NET語法
+0

你好,請參考我已經試過這是工作以外我不知道如何選擇特定的列 – user1570048

+0

我已經添加了一些代碼,我想一個例子代碼將會實現你正在尋找的東西,與Wasp的答案相比,這是一個相當完善的方式,但是這不需要使用匿名類型,所以你可以使用'CopyToDataTable'方法。 –

+0

增加了另一個編輯,因爲我意識到我的工作避免匿名類型不會像以前那樣工作。 –

0

,它應該是這樣的(我不保證100%的代碼實際上編譯):

Dim query = From r In bookedorders _ 
      Group By key = r.Field(Of Integer)("productgroup") Into Group _ 
      Select New With { _ 
       .key, _ 
       .Rows = From o In Group _ 
         Select New With { _ 
          .Name = r.Field(Of String)("productname") } } 

作進一步檢查,你可以看到這一點:

http://msdn.microsoft.com/en-us/vstudio/bb737908

,尤其是的GroupBy - 嵌套樣品,在這裏你可以看到你如何能一組內側突出。

如果你解決了這個問題,並在我的答案中發現一些編譯錯誤,讓我知道什麼,我會解決它。

+0

是的,但問題是我不能使用'copytodatatable' – user1570048

相關問題