从传入的模型中的Linq查询创建DataTable

时间:2014-05-01 18:30:33

标签: c# linq datatable linq-to-dataset

我正在尝试使用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; }    
}

2 个答案:

答案 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

这很简单:

  1. 复制文章中的ObjectShredder<T>源代码并将其放在自己的文件中,因为它是一个类。这是很多代码,但它可以帮助您避免手动构建DataTable。
  2. 从文章中添加CustomLINQtoDataSetMethods类,该文章将ObjectShredder包装在名为CopyToDataTable的漂亮扩展方法中。
  3. 接下来,使用CopyToDataTable而不是IEnumerable<T>
  4. 有了所有这些项目,您将能够按如下方式使用它:

    DataTable table = cl.CopyToDataTable();