2017-01-11 1 views
0

우리의 응용 프로그램에서는 DataTable에서 행을 필터링하는 성능을 향상시킵니다. IEnumerable을 얻기 위해 아래 코드를 수정했습니다.C#에서 성능을 향상시키기 위해 IEnumberable로 DataTable

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

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

에 성공하고 잘 작동했다. 참고 : ds는 데이터 집합 개체입니다.

우리는 여기에 우리가 조건이 "MAX"DB 기능을 포함로 해결할 수없는

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

같은 조건에 따라 행을 필터링하는 또 다른 시나리오가 있습니다.

이 문제를 해결하려면 해결 방법/제안을 제공해주십시오.

감사합니다, 는 스리랑카

+7

나는 당신이 필요하면' –

답변

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

전화 Select'보다 LINQ 쿼리를보다 효율적임을 의심 'DataTable'의 모든 행에 대해'DataRow []'가 가장 효율적입니다 :'DataRow [] drow = ds.Tables [0] .Select();'. 그러나 배열없이 LINQ 쿼리를 사용하여 테이블을 처리 할 수 ​​있습니다. DataTable.AsEnumerable()을 사용하십시오. –

+0

응답에 대해 Tim Schmelter와 Felipe Oriani에게 감사드립니다. 예, DataTable.AsEnumerable()을 사용하려고합니다. 그러나 위의 제안 된 솔루션에는 세 단계가 있습니다. 하나는 테이블에서 모든 행을 가져오고 두 번째는 최대 값을 찾고 마지막 단계는 비교하는 것입니다. 내 생각에, 이것은 성능에 영향을 미칠 것입니까? 나 맞아 ? 저에게 알려주세요. 그리고 이것을 처리 할 다른 해결책이 있습니까? – Sri

0

또 다른 해결책은 필드 'BALANCE'에 대한 오름차순 순서로 테이블을 주문하고

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); 

, 당신은 tablescan을해야한다. 대신 두 개의 스캔 (최대를 결정하고 비교)을하고, 당신은 한 번의 스캔으로 그들을 결합 수 :

// 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. 
관련 문제