我正在尝试使用Linq查询并填充数据表。经过一天尝试各种方法后,我有一些可以编译但我的问题是CopyToDataTable给出了一个空异常。
IEnumerable<DataRow> cancellations = cl.AsEnumerable() as IEnumerable<DataRow>;
Trace.WriteLine(cancellations);
DataTable datatable = cancellations.CopyToDataTable<DataRow>();
在Intellitrace中,如果我将鼠标悬停在取消上,则表示Null,并且Trace确认,如果我查看该方法的条目,则在cl上它具有预期的一条记录以及一条记录。
我错过了整天盯着它的简单的事情吗?
public class CancellationList
{
public int SchemeId { get; set; }
public DateTime EffectiveDate { get; set; }
public DateTime TransactionDate { get; set; }
public DateTime ExpiryDate { get; set; }
}
答案 0 :(得分:0)
没有内置的方法可以做到这一点。您需要对其进行编码。如果你只是想让它与CancellationList一起使用,你可以这样做
var cl = new List<CancellationList>();
var dataTable = new DataTable();
var toObject = cl.Select(c => new object[] {c.SchemeId, c.EffectiveDate, c.TransactionDate, c.ExpiryDate});
dataTable.Columns.Add("SchemeId", typeof (int));
dataTable.Columns.Add("EffectiveDate", typeof (DateTime));
dataTable.Columns.Add("TransactionDate", typeof(DateTime));
dataTable.Columns.Add("ExpiryDate", typeof(DateTime));
foreach (var data in toObject)
{
dataTable.Rows.Add(data);
}
答案 1 :(得分:0)
一种选择是按照此MSDN文章中的说明操作:How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow。
这很简单:
ObjectShredder<T>
源代码并将其放在自己的文件中,因为它是一个类。这是很多代码,但它可以帮助您避免手动构建DataTable。CustomLINQtoDataSetMethods
类,该文章将ObjectShredder
包装在名为CopyToDataTable
的漂亮扩展方法中。CopyToDataTable
而不是IEnumerable<T>
。有了所有这些项目,您将能够按如下方式使用它:
DataTable table = cl.CopyToDataTable();