2017-01-11 5 views
0

このアプリケーションでは、DataTableの行をフィルタリングするパフォーマンスを向上させます。 IEnumerableを得るために以下のコードを修正しました。C#のパフォーマンスを向上させるためのIEnumberableとしてのDataTable

DataRow[] drow = 
         (
         from item in ds.Tables[0].AsEnumerable() 
         where item["ID"].ToString() == id 
         select item 
         ).ToArray(); 

DataRow[] drow = ds.Tables[0].Select("ID ='" + id + "'"); 

それは成功したと細かい作業。 注:dsはデータセットオブジェクトです。

我々はここで

DataRow[] maxBalRow = ds.Tables[0].Select("BALANCE = MAX(BALANCE)"); 

などの条件に基づいて行をフィルタする別のシナリオを持っている私たちは、条件が「MAX」DB機能が含まれているとして解決することはできません。

この問題を解決するには、解決策/提案を提供してください。

おかげで、 スリ

+7

私はあなたが必要な場合はLINQクエリは、あなたの 'SELECT'コール –

答えて

2

あなたは(コメントのティムSchmelterの提案)を配列にDataTableを変換できます。その後

DataRow[] drow = ds.Tables[0].Select(); 

、あなたはサンプルのため、あなたのクエリを実行できます。

DataRow item = drow.FirstOrDefault(row => row["ID"] == id); 

// get the max balance first 
double maxBalance = drow.Max(row => (double)row["BALANCE"]); 

// search for items with the max balance 
DataRow[] item = drow.Where(row => row["BALANCE"] == maxBalance).ToArray(); 
+1

よりも効率的であることを疑います'DataTable'の全ての行の' DataRow [] 'が最も効率的です:' DataRow [] drow = ds.Tables [0] .Select(); '。しかし、配列を持たないLINQクエリを使用してテーブルを処理することができます。DataTable.AsEnumerable()を使用してください。 –

+0

応答にはTim SchmelterとFelipe Orianiに感謝します。はい、DataTable.AsEnumerable()を使用します。しかし、上記の解決策には3つのステップがあります。 1つはテーブルからすべての行を取得すること、2番目は最大値を見つけること、最後の手順は比較することです。私は、これはパフォーマンスを打つだろうと思う?私は正しいですか?私にお知らせください。これを処理する他のソリューションがありますか? – Sri

0

別の解決策は、 フィールド[残高]に対するASCのためにテーブルを注文し

DataRow[] myrows= ds.Tables[0].Select("","BALANCE ASC"); 
    DataRow rowtoget=myrows[myrows.Length-1]; 

最後row.e.gを選択することができ、それがお役に立てば幸いです。

0

IDを探していると思いますが、table.Rows.Find()メソッドを使用する必要があります。これはテーブルスキャンよりも高速です。 MAX(BALANCE)(と一致するすべての行)の検索

ds.Tables[0].Rows.Find(id); 

、あなたはテーブルスキャンを行う必要があります。代わりに、2つのスキャンを行う(最大を決定し、それらを比較)、あなたは1回のスキャンでそれらを組み合わせることができ:

// list of balances. 
var maxBalances = new List<DataRow>(); 

// initial value 
double maxBalance = 0; 

// check each row 
foreach(var row in ds.Tables[0]) 
{ 
    // read the value 
    var value = (double)row["BALANCE"]; 

    // if the value is higher than the previous balance, forget all previous selected rows. 
    if(value > maxBalance) 
    { 
     // set the new maxBalance value. 
     maxBalance = value; 

     // clear the list 
     maxBalances.Clear(); 
    } 

    // if the value == maxBalance, add it to the list. 
    if(value == maxBalance) 
     maxBalances.Add(row); 
} 

// maxBalances contains all rows who share the highest balance. 
関連する問題