2009-08-12 1 views
6

まずはLINQを使用しているnewbyです。実際に私はこれまで使用していませんでしたが、リストから来る値を使用してDataTableをフィルタリングする必要がある作業があります。 LINQでListable Filter値の値を使用してDatatableでクエリを実行することが可能かどうかを知りたいと思います。いくつかのヒントを教えていただけますLINQを使用してデータセットから行を選択します。ここではRowsIDのリストはリストにあります<T>

ありがとうございます。

答えて

7

これを行う最善の方法は、フィルタリングされた結果をどうするかによって異なります。さらなる操作のために結果をDataTableとして戻す必要があるのですか、結果にデータバインドしていますか?

あなたがたDataTableが必要な場合は、別のテーブルに行をインポートすることができ、一致でDataRow

//create sample table with sample rows 
DataTable table = new DataTable(); 

table.Columns.Add("id", typeof(int)); 

for (int i = 1; i < 11; i++) 
{ 
    DataRow row = table.NewRow(); 
    row[0] = i; 
    table.Rows.Add(row); 
} 

//filter the table by id (in a list) 
List<int> rowIds = new List<int> { 1, 3, 6 }; 

IEnumerable<DataRow> matchingRows = from DataRow row in table.Rows 
        where rowIds.Contains((int)row[0]) 
        select row; 

の(バインド可能)列挙子を返し、以下の例を見てみましょう:

DataTable filteredTable = table.Clone(); 

foreach (DataRow filteredRow in matchingRows) 
{ 
    filteredTable.ImportRow(filteredRow); 
} 
+0

一つの方法は、.CopyToDataTable()を使用しているが、この場合にはmatchingRows.Anyは、()()matchingRows.CopyToDataTableを行う前に、trueを返すかどうかをチェックしてください。これにはSystem.Data.DataTableExtensionsが必要です – Enrico

2

私は普通与えますLINQ-readyオブジェクトとしてpre-LINQオブジェクトを処理する必要があるときは、私自身の拡張メソッドを使用します。たとえば、DataRowCollection(DataTable.Rowsプロパティ)で照会することを検討していますが、これはおそらくDataRowのリスト以外には使用していない可能性があります。あなたのためにこの変換を行う拡張メソッドを作成します(DataRowCollectionをList<DataRow>にする)。何らかの理由で無効なキー名が列に与えられた場合に例外をスローする気にしないときに、通常は拡張メソッドを使用して値を安全に取得します。次に、intのリストをidとし、idを含むフィールド名を取得して望むものを返す拡張メソッドを作ることができます。すべてが完了したら、これは1行のコードで行います。すべての拡張メソッドを持つクラスは次のとおりです。単一のメソッド呼び出し:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication11 
{ 
    public static class SystemDataHelpers 
    { 
     public static List<DataRow> RowList(this DataTable table) 
     { 
      List<DataRow> list = new List<DataRow>(); 
      foreach (DataRow row in table.Rows) 
       list.Add(row); 
      return list; 
     } 

     public static object GetItem(this DataRow row, string field) 
     { 
      if (!row.Table.Columns.Contains(field)) 
       return null; 
      return row[field]; 
     } 

     public static List<DataRow> GetRows(this DataTable table, List<int> ids, string fieldName) 
     { 
      Func<DataRow, bool> filter = row => ids.Contains((int)row.GetItem(fieldName)); 
      return table.RowList().Where(filter).ToList(); 
     } 
    } 
} 

(...あなたは既にそれらを持っているあなたがする必要がないであろう)、あなたの変数を設定するよりもその後、他のは、実際の作業は、1行のコード(EDITで行われます):データテーブルに変換する

 DataTable table = new DataTable(); 
     List<int> rowIds = new List<int> { 1, 2, 3, 4 }; 
     string idFieldName = "row_id"; 

     List<DataRow> selected = table.GetRows(rowIds, idFieldName); 
関連する問題