设为首页 加入收藏

TOP

Linq技术三:LinqtoObject和生成数据表的扩展方法(五)
2015-11-21 01:31:09 来源: 作者: 【 】 浏览:5
Tags:Linq 技术 LinqtoObject 生成 数据 扩展 方法
容易看到结果。Linq有延迟查询功能,所以不作任何转换可以直接把所有的IQueryable结合在一起查询,最后用ToList()、Single()等返回真实结果。

来说一下CopyToDataTable,这个在MSDN上面已经有一个扩展方法来处理,而且经过测试使用没有任何问题:

'''


''' Convert non-datarow generic type to datatable
'''

''' generic object
'''
Public Class ObjectShredder(Of T)
' Fields
Private _fi As FieldInfo()
Private _ordinalMap As Dictionary(Of String, Integer)
Private _pi As PropertyInfo()
Private _type As Type

' Constructor
Public Sub New()
Me._type = GetType(T)
Me._fi = Me._type.GetFields
Me._pi = Me._type.GetProperties
Me._ordinalMap = New Dictionary(Of String, Integer)
End Sub

Public Function ShredObject(ByVal table As DataTable, ByVal instance As T) As Object()
Dim fi As FieldInfo() = Me._fi
Dim pi As PropertyInfo() = Me._pi
If (Not instance.GetType Is GetType(T)) Then
' If the instance is derived from T, extend the table schema
' and get the properties and fields.
Me.ExtendTable(table, instance.GetType)
fi = instance.GetType.GetFields
pi = instance.GetType.GetProperties
End If

' Add the property and field values of the instance to an array.
Dim values As Object() = New Object(table.Columns.Count - 1) {}
Dim f As FieldInfo
For Each f In fi
values(Me._ordinalMap.Item(f.Name)) = f.GetValue(instance)
Next
Dim p As PropertyInfo
For Each p In pi
values(Me._ordinalMap.Item(p.Name)) = p.GetValue(instance, Nothing)
Next

' Return the property and field values of the instance.
Return values
End Function

'''


''' Loads a DataTable from a sequence of objects.
'''

''' The sequence of objects to load into the DataTable.
''' The input table. The schema of the table must match that
''' the type T. If the table is null, a new table is created
''' with a schema created from the public properties and fields of the type T.
''' Specifies how values from the source sequence will be applied to
''' existing rows in the table.
''' A DataTable created from the source sequence.
'''
Public Function Shred(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable

' Load the table from the scalar sequence if T is a primitive type.
If GetType(T).IsPrimitive Then
Return Me.ShredPrimitive(source, table, options)
End If

' Create a new table if the input table is null.
If (table Is Nothing) Then
table = New DataTable(GetType(T).Name)
End If

' Initialize the ordinal map and extend the table schema based on type T.
table = Me.ExtendTable(table, GetType(T))

' Enumerate the source sequence and load the object values into rows.
table.BeginLoadData()
Using e As IEnumerator(Of T) = source.GetEnumerator
Do While e.MoveNext
If options.HasValue Then
table.LoadDataRow(Me.ShredObject(table, e.Current), options.Value)
Else
table.LoadDataRow(Me.ShredObject(table, e.Current), True)
End If
Loop
End Using
table.EndLoadData()

' Return the table.
Return table
End Function

Public Function ShredPrimitive(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable
' Create a new table if the input table is null.
If (table Is Nothing) Then
table = New DataTable(GetType(T).Name)
End If
If Not table.Columns.Contains("Value") Then
table.Columns.Add("Value", GetType(T))
End If

' Enumerate the source sequence and load the scalar values into rows.
table.BeginLoadData()
Using e As IEnumerator(Of T) = source.GetEnumerator
Dim values As Object() = New Object(table.Columns.Count - 1) {}
Do While e.MoveNext
values(table.Columns.Item("Value").Ordinal) = e.Current
If options.HasValue Then
table.LoadDataRo

首页 上一页 2 3 4 5 下一页 尾页 5/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇mybatis异常:元素内容必须由格式.. 下一篇对监听静态注册配置的理解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: