從在

2014-05-01 31 views
1

傳遞的模型中的Linq查詢創建一個DataTable我想要一個Linq查詢並填充數據表。經過一天的嘗試各種方法我有東西會編譯,但我的問題是,CopyToDataTable給出一個空的異常。從在

IEnumerable<DataRow> cancellations = cl.AsEnumerable() as IEnumerable<DataRow>; 

Trace.WriteLine(cancellations); 

DataTable datatable = cancellations.CopyToDataTable<DataRow>(); 

在智能跟蹤,如果我將鼠標懸停在取消它指出空和跟蹤確認,在CL它有一個創紀錄的預期以及一個記錄,如果我看的方法的進入。

我是否錯過了一整天都在盯着它的東西?

public class CancellationList 
{ 
    public int SchemeId { get; set; } 
    public DateTime EffectiveDate { get; set; } 
    public DateTime TransactionDate { get; set; } 
    public DateTime ExpiryDate { get; set; }  
} 
+1

什麼是'cl'?並嘗試刪除'作爲IEnumerable '。 – abatishchev

+0

cl是List cl = new List ();如果刪除IEnumerable ,那麼隨着我將列表添加到數據行(對於數據表),您將獲得轉換異常。我今天肯定已經嘗試過10種不同的方式,但這是我最接近的。 –

+0

CopyToDataTable只接受DataRow,除非CancellationList也是從DataRow繼承的,否則As會返回null。你可以給我們取消列表類 – CharlesNRice

回答

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); 
} 
0

一種選擇是按照此MSDN文章中說明:How to: Implement CopyToDataTable Where the Generic Type T Is Not a DataRow

這是非常簡單的:

  1. 複製文章中的ObjectShredder<T>源代碼,並將其放置在它自己的文件,因爲它是一個類。它有很多代碼,但它可以幫助您避免手動構建數據表。
  2. 從文章中添加CustomLINQtoDataSetMethods類,該文章將ObjectShredder包裝在名爲CopyToDataTable的漂亮擴展方法中。
  3. 接下來,使用CopyToDataTable超過IEnumerable<T>

有了所有這些項目,你就可以按如下方式使用它:

DataTable table = cl.CopyToDataTable(); 
+0

謝謝艾哈邁德,我首先接受了查爾斯的解決方案,並且選擇了它的作品。謝謝#Charles,從來沒有自己做過。 –