VB.NET: Convertire un oggetto IQueryable in una DataTable
L'extension method che vi propongo oggi converte un oggetto che implementa l'interfaccia IQueryable in una DataTable.
L'argomento fieldNames è una stringa nella forma:
proprieta1[?];proprieta2[?];.....;properietaN[?]
dove:
proprieta : è il nome di una proprietà dell'oggetto contenuto nell'argomento "IQueryable" che diventerà una colonna della DataTable risultato;
? : è facoltativo ed indica che la colonna può contenere valori nullable.
La proprietà può essere anche una sottoproprietà dell'oggetto.
L'extension method fa uso della funzione statica esposta nel post VB.NET : Recuperare il valore o il tipo di una proprietà in maniera ricorsiva tramite reflection.
<Extension()> _
Public Function ToDataTable(ByVal queryableObj As IQueryable, _
ByVal fieldNames As String) As DataTable
Dim retTable As New DataTable
' recupero il tipo di oggetto di cui è formata l'interfaccia
Dim objType = queryableObj.ElementType
Dim fields = fieldNames.Split(";")
' creo le colonne
For Each field In fields
If Not String.IsNullOrEmpty(field) Then
Try
Dim propName = field.Replace("?", "")
Dim colType = ReflectionUtility.GetPropertyType(objType, propName)
Dim colName = propName.Replace(".", "_")
Dim col As New DataColumn With {.ColumnName = colName, _
.DataType = colType, _
.AllowDBNull = field.EndsWith("?")}
retTable.Columns.Add(col)
Catch ex As Exception
End Try
End If
Next
' riempio le colonne
For Each currObj In queryableObj
Dim row = retTable.NewRow
For Each field In fields
Dim propName = field.Replace("?", "")
Dim colName = propName.Replace(".", "_")
If retTable.Columns.Contains(colName) Then
row(colName) = ToBDNullableValue(ReflectionUtility.GetPropertyValue(currObj, field))
End If
Next
retTable.Rows.Add(row)
Next
Return retTable
End Function
Public Function ToBDNullableValue(ByVal obj As Object) As Object
Dim retObj As Object = DBNull.Value
If obj IsNot Nothing Then
retObj = obj
End If
Return retObj
End Function
Per chiarire la situazione facciamo un'esempio, supponiamo di avere il seguente pezzo di codice:
Dim dipendenti As Dipendente() = _
{New Dipendente With {.Cognome = "Bianchi", _
.Nome = "Carlo", _
.DataNascita = New DateTime(1970, 2, 26)}, _
New Dipendente With {.Cognome = "Verdi", _
.Nome = "Giuseppe", _
.DataNascita = New DateTime(1978, 1, 1)}, _
New Dipendente With {.Cognome = "Rossi", _
.Nome = "Bruno", _
.DataNascita = New DateTime(1980, 1, 1)}, _
New Dipendente With {.Cognome = "Bonaventura", _
.Nome = "Alessandro", _
.DataNascita = New DateTime(1960, 1, 1)}}
Dim persTable = dipendenti.AsQueryable().ToDataTable("Cognome;Nome;DataNascita.Year")
La tabella persTable conterrà:
L'esempio mostra come l'extension method possa essere utilizzato anche con normali array grazie all'extension method AsQueryable() presente nel framework .NET 3.5.
I nomi delle colonne della DataTable sono uguali ai nomi delle proprietà passate per argomento con il '.' sostituito con '_'.
Nessun commento:
Posta un commento