2012-10-22 10 views
48

私は、ユーザーに関する情報と共にDataTableを使用しています。私は、このDataTableのユーザーまたはユーザーの一覧を検索します。私はC#のコードでそれを試してbutitここ:(データテーブルをどのようにフィルタリングできますか?

を動作しません:。

public DataTable GetEntriesBySearch(string username,string location,DataTable table) 
     { 
      list = null; 
      list = table; 

      string expression; 
      string sortOrder; 

      expression = "Nachname = 'test'"; 
      sortOrder = "nachname DESC"; 

      DataRow[] rows = list.Select(expression, sortOrder); 

      list = null; // for testing 
      list = new DataTable(); // for testing 

      foreach (DataRow row in rows) 
      { 
       list.ImportRow(row); 
      } 

      return list; 
     } 
+0

コードは動作していますか、エラーが発生しますか? – Karthik

+0

正確に動作しないものについて詳しく説明できますか?あなたは例外を受けるか、0の結果(2つの異なるもの)を得ますか? – James

答えて

4

このタスクのためのDataViewを使用することをお勧めし、それを使用しての

例あなたが見つけることができますこの記事は:How to filter data in dataview

73

あなたは、少なくとも.NET 3.5を使用している場合、私はそれをはるかに読みやすく、強力ですので、代わりにLinq-To-DataTableを使用することをお勧め:

DataTable tblFiltered = table.AsEnumerable() 
      .Where(row => row.Field<String>("Nachname") == username 
        && row.Field<String>("Ort") == location) 
      .OrderByDescending(row => row.Field<String>("Nachname")) 
      .CopyToDataTable(); 

上記のコードは単なる例で、実際にはmany more methods availableです。

using System.Linq;AsEnumerable拡張メソッドの場合は、System.Data.DataSetExtensions dll(How)への参照を追加することを忘れないでください。

+2

注意 - CopyToDataTable()はdatarowsをコピーします。これはクローン操作ではないため、元の表のプロパティの一部はコピーされません。テーブル名 –

+1

@Tim:このコードのパフォーマンスの観点はどうですか?いくつかのオブジェクトリストに格納してlinq/lambdaを適用する方が良いでしょうか? –

+2

@RajeshMishra:すでに 'DataTable'が埋められている場合はそれをそのまま残してください。さもなければボクシング/アンボクシングがないので 'List 'が好きです。 'DataTable'はすべてのために' System.Object'を使います。常にキャストする必要があります。意味のあるプロパティを持つカスタムクラスを持つことは、読みやすさとは別に多くの利点があります。 –

9

クリア:

list = null; // for testing 
list = new DataTable(); // for testing 

foreach (DataRow row in rows) 
{ 
    list.ImportRow(row); 
} 

使用:

​​

例:

(念のため)VB.NETで働く誰のために0
string _sqlWhere = "Nachname = 'test'"; 
string _sqlOrder = "Nachname DESC"; 

DataTable _newDataTable = yurDateTable.Select(_sqlWhere, _sqlOrder).CopyToDataTable(); 
+1

これは質問に答えた理由をもう少し詳しく説明できますか? –

5

Dim dv As DataView = yourDatatable.DefaultView 

dv.RowFilter ="query" ' ex: "parentid = 0" 
0

こんにちは、私たちは、時にはそれがフィルタリングされていないメソッドTOLOWER使用することができます。

EmployeeId = Session["EmployeeID"].ToString(); 
var rows = dtCrewList.AsEnumerable().Where 
    (row => row.Field<string>("EmployeeId").ToLower()== EmployeeId.ToLower()); 

    if (rows.Any()) 
    { 
     tblFiltered = rows.CopyToDataTable<DataRow>(); 
    } 
関連する問題