2012-12-21 45 views
0

我想查詢的兩個DataTables(通過解析Excel文件填充)使用LINQ和他們一起匹配的字段,「UPC」,具體如下:將LINQ查詢返回給DataTable .NET 3.5?

Dim query = From c In dt.AsEnumerable() _ 
Join r In dtUnits.AsEnumerable() _ 
On c.Field(Of String)("UPC") Equals r.Field(Of String)("UPC") _ 
Select New With {.UPC = r.Field(Of String)("UPC")} 

此外,我想複製這一LINQ查詢結果一個DataTable。我發現了一個methodCopyToDataTable(),但它在.NET 4.5中,而我們的服務器只支持.NET 3.5。

我該怎麼做才能在VB .NET 3.5中模擬這個功能?

謝謝!

+1

它也可以在.NET 3.5中使用。 http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.copytodatatable(v=vs.90).aspx –

+0

這很奇怪,它沒有出現在Intellisense中,我相信我有正確的參考和進口--'Imports System.Linq'和'Imports System.Data' - 我錯過了什麼? – TimeBomb006

+1

@ user1496816:它在Intellisense中不可用,因爲它是「IEnumerabley 」的擴展名,您選擇了「IEnumerable <匿名類型>」。 –

回答

2

CopyToDataTable自.NET 35以來就已經存在了。但是問題在於,您希望從匿名類型創建一個「從零開始」的DataTable。這是行不通的。

CopyToDataTable僅用於IEnumerable<DataRow>的延伸。所以,你要麼必須從你的加入DataTables選擇一個DataRow

Dim query = From c In dt.AsEnumerable() _ 
      Join r In dtUnits.AsEnumerable() _ 
      On c.Field(Of String)("UPC") Equals r.Field(Of String)("UPC") _ 
      Select c 
Dim table = query.CopyToDataTable() 

或使用this ObjectShredder它使用反射,因此不是最有效的方式(C# implementation)。

+0

非常好。謝謝。因爲我不太關心性能,我想我會使用ObjectShredder方法。不過,這有點高於我的頭。我在項目中添加了'DataSetLinqOperators.vb'和'ObjectShredder.vb',但我不知道如何實現它們。 – TimeBomb006

+1

您需要添加擴展方法:http://msdn.microsoft.com/en-us/library/bb669096.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2 –

+0

謝謝。這解決了我的問題。 – TimeBomb006