2013-10-08 46 views
1

我試圖從一個數據表中特定列檢索所有不同值的檢索數據表中不同的值。數據表中的列名是「Count」。我有2240行,在「計數」列中有6個不同的值。問題是,當我執行下面的代碼時,它給我的行數而不是6個不同的值。使用LINQ vb.net

Dim counts = (From row In loadedData 
Select row.Item("Count")).Distinct() 
For Each i In counts 
    MsgBox(i) 
Next 

我該如何修改它以檢索6個不同的值,而不是它給我的總行數?

+0

僅供參考 - 在此數據表中的值都是獨一無二的......除了「計數」列。我相信這就是它返回2240行的原因,而不僅僅是6個唯一的計數值。 –

回答

3

你一定要選擇列,並使用Enumerable.Distinct

Dim distinctCounts As IEnumerable(Of Int32) = loadedData.AsEnumerable(). 
    Select(Function(row) row.Field(Of Int32)("Count")). 
    Distinct() 

在查詢語法(我不知道,即使Distinct在VB.NET直接支持):

distinctCounts = From row In loadedData 
       Select row.Field(Of Int32)("Count") 
       Distinct 
+0

我試圖用你的代碼貼出來,但我不認爲你看了我的最後的評論。所有2240都是獨一無二的,但我只是想獲得唯一的計數欄。 「從數據表中選擇不同的計數」 - 本質上。 –

+0

@JohnJanssen:這正是您發佈的sql查詢中的'Linq-To-DataSet'等價物。它只從表中返回不同的計數。因此,如果表中包含2240行和'Count'列包含6個不同的數字(遍及所有行),查詢只返回6不同的號碼。 –

0

你也可以應用這個邏輯,如果你願意, 首先通過columName對數據表進行排序, 然後應用這個邏輯

dtRecords.DefaultView.Sort = "columnName" 
    dtRecords = dtRecords.DefaultView.ToTable 
    Dim totalRecords As Integer = 0 
    Dim thNameStr As String = filter(dtRecords, "columnName", totalRecords) 

Public Shared Function filter(ByVal dtRecords As DataTable, ByVal columnName As String, ByRef totalRecords As Integer) As String 
      Dim FilterStr As String = "" 
      Dim eachTotal As Integer = 0 
      totalRecords = 0 
      Dim lastName As String = "" 
      For rCount = 0 To dtRecords.Rows.Count - 1 
       If lastName <> "" And lastName <> dtRecords.Rows(rCount)("" & columnName) Then 
        FilterStr &= lastName & " - [" & eachTotal & "]" 
        eachTotal = 0 
        totalRecords += 1 
       End If 
       lastName = dtRecords.Rows(rCount)("" & columnName) 
       eachTotal += 1 
      Next 
      FilterStr &= lastName & " - [" & eachTotal & "]" 
      totalRecords += 1 
      Return FilterStr 
     End Function 
+0

有點臃腫。這看起來像很多代碼來做同樣的事情,我可以在LINQ的三行代碼中完成。儘管如此,代碼看起來並不錯。 –

2

可以使用ToTable(不同由於布爾,的ParamArray COLUMNNAMES作爲字符串()),用於此方法。

loadedData.DefaultView.ToTable(True, "Count") 

這將返回不同的用戶對你。如果需要,您可以添加多個列名稱。

這裏是MSDN文檔。 https://msdn.microsoft.com/en-us/library/wec2b2e6(v=vs.110).aspx

+1

請編輯更多信息。只有代碼和「試試這個」的答案是[灰心](http://meta.stackexchange.com/questions/196187/is-try-this-bad-practice),因爲它們不包含可搜索的內容,也不解釋爲什麼有人應該「嘗試這個」。 –