2010-04-16 45 views
3

基本上我試圖重現以下MSSQL查詢作爲LINQLinq to Datarow,選擇多列作爲獨特?

SELECT DISTINCT [TABLENAME], [COLUMNNAME] FROM [DATATABLE] 

我已經得到了最接近的是

Dim query = (From row As DataRow In ds.Tables("DATATABLE").Rows _ 
        Select row("COLUMNNAME") ,row("TABLENAME").Distinct 

當我做了以上我得到的錯誤

範圍變量名稱只能從簡單或限定名稱 推斷爲 ,不帶參數。

我有點期待它返回一個集合,然後我可以迭代併爲每個條目執行操作。 也許是一個數據收集?

作爲一個完整的LINQ newb,我不知道我錯過了什麼。 我試過的變化上

Select new with { row("COLUMNNAME") ,row("TABLENAME")} 

,並得到:

匿名類型成員的名字可以 只能從一個簡單的或不帶任何參數 限定名推斷。

來解決這個問題我已經試過

Dim query = From r In ds.Tables("DATATABLE").AsEnumerable _ 
     Select New String(1) {r("TABLENAME"), r("COLUMNNAME")} Distinct 

但它似乎並沒有得到適當的做不同的事情。

此外,有沒有人知道任何好書/資源流利?

回答

1

我想我已經想通了。 感謝您的幫助。

也許有一個更簡單的方法呢?

我做了什麼是

Dim comp As StringArrayComparer = New StringArrayComparer 
Dim query = (From r In ds.Tables("DATATABLE").AsEnumerable _ 
     Select New String(1) {r("TABLENAME"), r("COLUMNNAME")}).Distinct(comp) 

這將返回一個新的字符串數組(2元)運行自定義比較

Public Class StringArrayComparer 
    Implements IEqualityComparer(Of String()) 

    Public Shadows Function Equals(ByVal x() As String, ByVal y() As String) As Boolean Implements System.Collections.Generic.IEqualityComparer(Of String()).Equals 

     Dim retVal As Boolean = True 

     For i As Integer = 0 To x.Length - 1 
      If x(i) = y(i) And retVal Then 
       retVal = True 

      Else 
       retVal = False 
      End If 

     Next 

     Return retVal 

    End Function 

    Public Shadows Function GetHashCode(ByVal obj() As String) As Integer Implements System.Collections.Generic.IEqualityComparer(Of String()).GetHashCode 

    End Function 
End Class 
6

你開始你的DataTable對象使用LINQ,您運行對dt.AsEnumberable,返回DataRow對象的IEnumerable集合的查詢。

Dim query = From row As DataRow In ds.Tables("DATATABLE").AsEnumerable _ 
       Select row("COLUMNNAME") ,row("TABLENAME") 

你可能想說row("COLUMNNAME").ToString()等查詢,都會變成一個匿名類型與串2種性能的IEnumerable;那是你在追求什麼?您可能需要指定屬性的名稱;我不認爲編譯器會推斷它們。

Dim query = From row As DataRow In ds.Tables("DATATABLE").AsEnumerable _ 
       Select .ColumnName = row("COLUMNNAME"), .TableName = row("TABLENAME") 

這假設在您的原始sql查詢中,您使用ADO獲取此數據集,您確保您的結果是不同的。

混亂的常見原因:

一個關鍵是,LINQ到SQL和(在Linq到對象活動俗稱)LINQ到數據集是兩個完全不同的事情。在這兩種情況下你都會看到LINQ被使用,所以它經常會引起混淆。

LINQ到數據集

是:

1讓你總是有你的數據表同樣的老辦法,用數據適配器和連接等,與傳統的DataTable對象結束了。然後,您不必像以前那樣遍歷行,而是:

2運行鍼對dt.AsEnumerable的linq查詢,這是一個IEnumerable數據行對象。

LINQ到數據集選擇在(一個使用LINQ到SQL,而是使用傳統的ADO.NET,但後來(),一旦你有你的數據表,使用LINQ(到對象)來檢索/安排/過濾數據表中的數據,而不是我們已經做了6年。我做了很多。我愛我經常ADO SQL(與工具,我已經開發了),但LINQ是偉大

LINQ到SQL

是一個不同的野獸,用完全不同的事情引擎蓋下發生。在LINQ-to-SQL中,您可以:

1使用Visual Studio中的工具定義一個與您的數據庫相匹配的模式,該工具爲您提供了與您的模式匹配的簡單實體對象。
2您使用db 上下文編寫linq查詢,並將這些實體作爲結果返回。

在運行時,.NET將這些LINQ查詢轉換爲SQL並將它們發送到數據庫,然後將數據返回轉換爲您在模式中定義的實體對象。

其他資源:

那麼,這是一個相當截斷的總結。爲了進一步瞭解這兩個非常不同的東西,檢查出:
LINQ-to-SQL
LINQ-to-Dataset

一個夢幻般的書LINQ是LINQ in Action,我法布里斯Marguerie,史蒂夫Eichert和吉姆·伍利(曼寧)。去實現它(夢想);去得到它(東西!只是你在追求什麼。很好。 LINQ不是一個閃光點,值得一本書。在.NET中有很多東西需要學習,但花在LINQ上的時間花費了很多時間。

0

我有同樣的問題,並從各個位我學習LINQ和IEnumerables,下面爲我工作:

Dim query = (From row As DataRow In ds.Tables("DATATABLE").Rows _ 
       Select row!COLUMNNAME, row!TABLENAME).Distinct 

奇怪地使用舊的VB爆炸( !)語法擺脫了「範圍變量名稱...」錯誤但主要區別是在查詢結果(IEnumerable)對象上使用.Distinct方法,而不是嘗試在查詢中使用Distinct關鍵字。

這LINQ查詢然後返回的anonymous type匹配從DataRow中選定列的屬性IEnumerable集合,所以下面的代碼然後訪問:

For Each result In query 
    Msgbox(result.TABLENAME & "." & result.COLUMNNAME) 
Next 

希望這可以幫助別人過這個問題絆腳石.. 。