2009-06-27 183 views
2

我有一個(斷開)在XML中,這是我在LINQ查詢類型化的DataSet:返回類型的DataTable從LINQ查詢

var productlist = from prds in dsProducts.Products.AsEnumerable() 
where (prds.Field<string>("productid").Contains(searchpattern) || 
     prds.Field<string>("productname").Contains(searchpattern)) 
select prds; 

這份名單是好的,但如果我試着說:

return (DataSetProducts.productsDataTable)productlist.Skip(begin).Take(pagesize).CopyToDataTable(); 

它說它不能將System.DataTable轉換爲DataSetProducts.productsDataTable,但它是同一張表。

關於如何返回一個類型的DataTable的任何想法?

回答

2

好,CopyToDataTable無法知道什麼是正確的強烈DataTable類型給定類型的DataRow,因爲DataRow不提供信息(這是一種恥辱恕我直言)的方式。

也許你可以編寫自己的CopyToDataTable方法,該方法需要另一個類型參數來指定表類型。類似的東西:

public static TTable CopyToDataTable<TRow, TTable>(this IEnumerable<TRow> rows) 
    where TRow : DataRow, new() 
    where TTable : DataTable, new() 
{ 
    TTable table = new TTable(); 
    foreach (TRow row in rows) 
    { 
     TRow rowCopy = new TRow(); 
     object[] itemArrayCopy = new object[row.ItemArray.Length]; 
     row.ItemArray.CopyTo(itemArrayCopy, 0); 
     rowCopy.ItemArray = itemArrayCopy; 
     table.Rows.Add(rowCopy); 
    } 
    return table; 
} 

編輯:

我怎麼能在上面的例子中使用這個新功能呢?

您必須將此擴展方法放在靜態類中。如果將該類放入不同的名稱空間中,請確保使用using子句在該作用域中導入該名稱空間。

然後可以使用這樣的方法(你必須指定類型參數,因爲TTable的類型不能由編譯器推斷):

return productlist.Skip(begin).Take(pagesize).CopyToDataTable<DataSetProducts.productsRow, DataSetProducts.productsDataTable>(); 

請注意,我沒有測試此代碼,可能會有一些錯誤...

+0

Wery很好的解決方法,謝謝。對於像我這樣的假人來說,一個問題是:我如何在上面的例子中使用這個新功能? – balint 2009-06-27 22:04:15