2009-06-27 16 views
2

I持っている(切断)私はLINQでクエリXMLでデータセットを入力:戻るLINQのクエリからのDataTableを入力

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

まあ、CopyToDataTableDataRowは(私見恥である)、その情報を提供していないため、DataRowの指定された型の正しい強いDataTableタイプが何であるかを知る方法はありません。

おそらく、あなた自身の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; 
} 

EDIT:

どのように私は上記の例では、この新しい機能を使用することができますか?

この拡張メソッドを静的クラスに配置する必要があります。クラスを別の名前空間に配置する場合は、using句を使用してその名前空間をスコープ内にインポートするようにしてください。

あなたはその後、(TTableとタイプは、コンパイラによって推測することができないので、あなたは型パラメータを指定する必要があります)そのようなメソッドを使用することができます。

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

私はこのコードをテストしていないことに注意してくださいいくつかのバグがあるかもしれません...

+0

Wery nice workaround、ありがとうございます。私のような人形のための1つの質問:上記の例でこの新しい関数を使用するにはどうすればよいですか? – balint

+0

私の更新された回答を見る –

関連する問題