2017-09-06 67 views
0

我有一個DataTable超過100列和超過280行,我需要按不同的用戶ID分組 ,然後單獨處理每一行。 用戶標識是唯一的,但是,每個用戶標識可以有多行(每個 用戶標識可以有1到20行關聯)。 所有列(包括UserID)都是字符串值。LINQ數據表

我用這樣的代碼:

Dim src = From row In sampleTable.AsEnumerable() 

返回一個EnumerableRowCollection(中DataRow中),但是當我嘗試按DataTable的 用戶名專欄中,我得到一個錯誤。

我需要通過對UserID進行消毒來對DataTable中的行進行分組,並處理每一行。爲了執行子處理要求,我還需要跟蹤我處理的每個不同的用戶ID。

如何將DataTable按不同的UserID分組並訪問所有具有重複UserID的行?

我收到迄今的答覆後,我嘗試這樣做:

Dim src = loanTable.AsEnumerable().ToLookup(x >= x.bSSN, x >= x) 

和ToLookup得到了一個錯誤()。 「重載解析失敗,因爲沒有可訪問的'ToLookup'可以用這些參數調用(不能推斷出類型參數'TKey') 另外,ToLookup中的'x'(x => x.UserID,x => x)返回「X」未聲明的錯誤

+0

能否請您提供您當前的嘗試,也追加了完整的錯誤信息。 –

回答

2

我不知道你的問題GroupBy,但這個工程:。

Dim userIdGroups = sampleTable.AsEnumerable().GroupBy(Function(row) row.Field(Of Int32)("UserId")) 

現在每個組中包含與該用戶ID的所有行

另一個選擇是使用查找(類似於字典,但可以訪問不可用的鍵,並獲得空行序列b ACK而不是例外情況):

Dim userIdLookup = sampleTable.AsEnumerable().ToLookup(Function(row) row.Field(Of Int32)("UserId")) 

Dim userid1Rows As IEnumerable(Of DataRow) = userIdLookup(1) 

你也可以使用一個For each來枚舉GroupByLookup的所有組。

For Each rg In userIdLookup 
    Dim userid = rg.Key 
    Dim count = rg.Count() 
    ' if you want to enumerate the rows: 
    For Each row In rg 
     ' process 
    Next 
Next 
+0

對於你所指的每一個將會是這樣的: 對於每一行userIdGroups Next - ? –

+0

@RandyJohnson:你的代碼中的'row'變量會有'Key'屬性,你可以訪問'UserId'。 –

+0

好吧,我看到哪裏可以得到每個組的密鑰以及計數,我是否使用嵌套的For Each來處理每個組中的每一行?我必須從每行的每列中獲取信息並將其輸入到IBM Mainframe Reflections會話中。 –