2013-01-20 10 views
8

私はdatatableでLINQクエリを実行しています。Linq on DataTable:テーブル全体ではなく、データテーブルに特定の列を選択してください。

行全体ではなく特定の列を選択し、結果をdatatableに入力したいとします。どうやってやるの??

マイコード:

public DataTable getConversions(string c_to, string p_to) 
{ 
    var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

    DataTable conversions = query.CopyToDataTable(); 
+2

「エラーが発生しました」:どのようなエラーが表示されますか? –

+1

エラー: ジェネリック型またはメソッド 'System.Data.DataTableExtensions.CopyToDataTable (System.Collections.Generic.IEnumerable )'で 'AnonymousType#1'型を 'T'型パラメーターとして使用できません。 'AnonymousType#1'から 'System.Data.DataRow'への暗黙的な参照変換はありません。 –

+0

[CopyToDataTableとLINQクエリを使用した例外?](http://stackoverflow.com/questions/1072120/exception-using-copytodatatable-with-linq-query) –

答えて

8

あなたはすでにあなたの新しいDataTableには、必要がありますどのように多くの列事前にわかっている場合、あなたはこのような何かを行うことができます:ここで私はmainDataTableからわずか3つの特定の列を取得し、フィルタを使用

DataTable matrix = ... // get matrix values from db 

DataTable newDataTable = new DataTable(); 
newDataTable.Columns.Add("c_to", typeof(string)); 
newDataTable.Columns.Add("p_to", typeof(string)); 

var query = from r in matrix.AsEnumerable() 
      where r.Field<string>("c_to") == "foo" && 
        r.Field<string>("p_to") == "bar" 
      let objectArray = new object[] 
      { 
       r.Field<string>("c_to"), r.Field<string>("p_to") 
      } 
      select objectArray; 

foreach (var array in query) 
{ 
    newDataTable.Rows.Add(array); 
} 
+0

それはトリックを行います。ありがとうございました! –

3

SELECT文は、匿名型、でDataRowのない配列の配列を返します。 CopyToDataTable()は、でのみ利用可能です。ここで、Tは、DataRowに由来します。 CopyToDataTableを呼び出す行オブジェクトrを選択できます。

var query = from r in matrix.AsEnumerable() 
       where r.Field<string>("c_to") == c_to && 
         r.Field<string>("p_to") == p_to 
       select r; 

DataTable conversions = query.CopyToDataTable(); 

implement CopyToDataTableまた、汎用タイプTはDataRowではありません。

+0

に入力する正しい方法です。私のコードが間違っていることが分かります。問題は、行全体ではなく2つの列だけを選択する正しい方法は何かということです。 –

+0

私はそれを行うために私の答えで記事へのリンクを追加しました。http://msdn.microsoft.com/en-us/library/bb669096.aspx – Adil

+0

データローとしてタイプを残しても、特定のカラムを単にフィルタリングできますか? –

6

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable() 
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount"); 
5

お試しAccess DataTable easiest way Linqを使用してDataTable、DataSetにアクセスするための完璧なアイデアを得るのに役立ちます。

次の試験を検討してくださいここでは、DataTableとします。上記

ここ
DataTable ObjDt = new DataTable("List"); 
ObjDt.Columns.Add("WorkName", typeof(string)); 
ObjDt.Columns.Add("Price", typeof(decimal)); 
ObjDt.Columns.Add("Area", typeof(string)); 
ObjDt.Columns.Add("Quantity",typeof(int)); 
ObjDt.Columns.Add("Breath",typeof(decimal)); 
ObjDt.Columns.Add("Length",typeof(decimal)); 

はDatTableためのコードであり、ここでは、このデータテーブルで提供され、我々は下記のようにいくつかのデータを処理することによって、特定のグリッドビューを結合しなければならないいくつかのデータがあると仮定する。

エリア | 数量 | ブレス | 長さ | 価格=数量*息*私たちは私たちが望むよう私たちに正確な結果を与える次のクエリを解雇しなければならない長さよりも

var data = ObjDt.AsEnumerable().Select 
      (r => new 
      { 
       Area = r.Field<string>("Area"), 
       Que = r.Field<int>("Quantity"), 
       Breath = r.Field<decimal>("Breath"), 
       Length = r.Field<decimal>("Length"), 
       totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length")) 
      }).ToList(); 

このデータ変数をデータソースとして割り当てるだけで済みます。

5

LINQはかなりのDataTableよりリスト上で使用することは非常に効果的で簡単です...私たちは得ることができますこの単純なLINQクエリを使用することにより

は、私たちの受け入れ、すべての、そしてまた、我々はこれを他のすべてのLINQクエリを実行することができます。私は上記の答えが私が好きではないループ(for、foreach)があることがわかります。

DataTableからperticular列を選択するのに最適なのは、DataViewを使用して列をフィルタリングし、必要に応じて使用することだけです。

ここでそれを見つける方法。

DataView dtView = new DataView(dtYourDataTable); 
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA"); 

今のDataTable dtTableWithOneColumnは1列のみ(ColumnA)が含まれています。

関連する問題