我正在JOIN
两个DataTales(通过解析两个Excel电子表格填充)。这些Excel电子表格包含列TOTAL_DOLLARS
和TOTAL_UNITS
,并不总是有一个值。由于这个原因,当我尝试运行query.CopyToDataTable()
DataSet does not support System.Nullable<>
Dim query = From c In dtDollars.AsEnumerable() _
Join r In dtUnits.AsEnumerable() _
On c.Field(Of String)("UPC") Equals r.Field(Of String)("UPC") _
Select _
New _
With {.UPC = r.Field(Of String)("UPC"), .WIC_NUMBER = c.Field(Of String)("WIC_NUMBER"), _
.WAG_ITEM_DESC = c.Field(Of String)("WAG_ITEM_DESC"), _
.WAG_BRAND = c.Field(Of String)("WAG_BRAND"), .UOM = c.Field(Of String)("UOM"), _
.GSK_PROMO_GRP = c.Field(Of String)("GSK_PROMO_GRP"), _
.TOTAL_DOLLARS = c.Field(Of Decimal?)("TOTAL_DOLLARS"), _
.TOTAL_UNITS = r.Field(Of Integer?)("TOTAL_UNITS"), _
.WKND_DATE = c.Field(Of DateTime)("WKND_DATE")}
myResultTable = query.CopyToDataTable()
我能做些什么来解决这个问题?是否可以将这些列的默认值设置为0 if = DBNull.Value
?
这里是Modules
和Extensions
我使用的CopyToDataTable()
方法:
Public Module CustomLINQtoDataSetMethods
<Extension()> _
Public Function CopyToDataTable(Of T)(ByVal source As IEnumerable(Of T)) As DataTable
Return New ObjectShredder(Of T)().Shred(source, Nothing, Nothing)
End Function
<Extension()> _
Public Function CopyToDataTable(Of T)(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As LoadOption?) As DataTable
Return New ObjectShredder(Of T)().Shred(source, table, options)
End Function
End Module
Module DataSetLinqOperators
''' <summary>
''' Creates a <see cref="DataTable"/> that contains the data from a source sequence.
''' </summary>
''' <remarks>
''' The initial schema of the DataTable is based on schema of the type T. All public property and fields are turned into DataColumns.
''' If the source sequence contains a sub-type of T, the table is automatically expanded for any addition public properties or fields.
''' </remarks>
<Extension()> _
Public Function ToDataTable(Of T)(ByVal source As IEnumerable(Of T)) As DataTable
Return New ObjectShredder(Of T)().Shred(source, Nothing, Nothing)
End Function
''' <summary>
''' Loads the data from a source sequence into an existing <see cref="DataTable"/>.
''' </summary>
''' <remarks>
''' The schema of <paramref name="table" /> must be consistent with the schema of the type T (all public property and fields are mapped to DataColumns).
''' If the source sequence contains a sub-type of T, the table is automatically expanded for any addition public properties or fields.
''' </remarks>
<Extension()> _
Public Function LoadSequence(Of T)(ByVal source As IEnumerable(Of T), ByVal table As DataTable, ByVal options As System.Nullable(Of LoadOption)) As DataTable
If table Is Nothing Then
Throw New ArgumentNullException("table")
End If
Return New ObjectShredder(Of T)().Shred(source, table, options)
End Function
End Module
另外,我正在使用ObjectShredder类。
任何帮助都非常感谢!
试试这个:
.TOTAL_DOLLARS = If( (c.Field(Of Decimal?)("TOTAL_DOLLARS")).HasValue, _
(c.Field(Of Decimal?)("TOTAL_DOLLARS"), 0))