我正在嘗試撰寫一個通用函式,該函式可用于在任意列中查找任意值DataTable,并在同一列中的另一個任意列中回傳相應值DataTable。我不關心多個值或多個匹配;資料的組織方式使得它們無論如何都不會發生,我想要的只是讓它回傳第一個匹配(如果存在),或者不回傳任何內容。
我將代碼基于這個非常簡單的示例:
Private Function TableLookup(dtb As DataTable, lookupFieldName As String, lookupFieldValue As Integer, returnFieldName As String) As String
Dim result As String
Dim matches = From row In dtb Let lookup = row.Field(Of Integer)(lookupFieldName) Where lookup = lookupFieldValue
If matches.Any Then result = matches.First().row.Field(Of String)(returnFieldName)
Return result
End Function
但顯然,只有當 lookupField 是一個Integer欄位并且 returnField 是一個String欄位時才有效。因為函式需要處理任意列,所以這些列可以有任意DataTypes? 并且回傳的值也是任意的(可以是 a Integer,也可以是 a String...等)
顯然,我可以DataType很容易地確定每列的 s 是什么:
Dim lookupFieldType As Type = dtb.Columns("lookupFieldName").DataType
Dim returnFieldType As Type = dtb.Columns("returnFieldName").DataType
但這仍然沒有用,因為row.Field(Of T)它是強型別的;我不能使用變數來指定DataType:
Dim matches = From row In dtb Let lookup = row.Field(Of lookupFieldType)(lookupFieldName) Where lookup = lookupFieldValue
If matches.Any Then result = matches.First().row.Field(Of returnFieldType)(returnFieldName)
有一種感覺,我一開始就以完全錯誤的方式解決這個問題,但似乎應該有一種直接的方法來查找資料表中的任意列(否則擁有它們有什么意義,對吧?)
有什么建議么?
uj5u.com熱心網友回復:
如果您在呼叫該方法時知道兩列的型別是什么,則可以將其設為通用,如下所示:
Private Function TableLookup(Of TKey As IEquatable(Of TKey), TResult)(table As DataTable,
keyColumnName As String,
key As TKey,
resultColumnName As String) As TResult
Dim row = table.AsEnumerable().FirstOrDefault(Function(dr) dr.Field(Of TKey)(keyColumnName).Equals(key))
Return If(row Is Nothing, Nothing, row.Field(Of TResult)(resultColumnName))
End Function
這個方法可能會這樣呼叫:
Dim name As String = TableLookup(Of Integer, String)(myDataTable,
"Id",
id,
"Name")
如果您不知道列型別是什么,則可以使用以下內容:
Private Function TableLookup(table As DataTable,
keyColumnName As String,
key As Object,
resultColumnName As String) As Object
Dim keyType = key.GetType()
If keyType IsNot table.Columns(keyColumnName).DataType Then
Return Nothing
End If
Dim filterExpression As String
If keyType Is GetType(String) Then
filterExpression = $"{keyColumnName} = '{key}'"
ElseIf keyType Is GetType(Date) Then
filterExpression = $"{keyColumnName} = #{key:M/dd/yyyy h:mm:ss tt}#"
Else
filterExpression = $"{keyColumnName} = {key}"
End If
Dim row = table.Select(filterExpression).FirstOrDefault()
Return If(row Is Nothing, Nothing, row(resultColumnName))
End Function
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/520126.html
上一篇:在VB.NET中保存記錄
下一篇:將列舉值存盤到xml檔案
