2011-07-12 32 views
1

我需要一個額外的過濾器添加到這個LINQ語句,但我似乎無法得到它的正確LINQ過濾從一個DataRow

var _duplicateRows = 
    dt.AsEnumerable().GroupBy(
     myRow => 
     new 
      { 
       accidentYear = myRow.ItemArray[1].ToString().Trim(), 
       reviewLine = myRow.ItemArray[2].ToString().Trim() 
      }).Where(grp => grp.Count() > 1).Select(grp => grp.Key); 

我需要的是排除和行,其中accidentYear和reviewLine是空或空

TIA

--edit

嗨,我只是想更新帖子。在決定分組之前,我決定先用這個來清理數據表。

public DataTable GetCleanDataTable(DataTable dt) 
     { 
      IEnumerable<DataRow> _query = 
       dt.AsEnumerable().Where(
        dt1 => 
        (!Convert.IsDBNull(dt1.ItemArray[0].ToString()) && 
        !Convert.IsDBNull(dt1.ItemArray[1].ToString()) && 
        !Convert.IsDBNull(dt1.ItemArray[2].ToString()))); 

      return _query.CopyToDataTable<DataRow>(); 
     } 
+0

你的意思是你的'myRow.ItemArray [1]'和'myRow.ItemArray [2]'是空的還是空的? –

回答

2

將where子句添加到數據表中。

var _duplicateRows = 
    dt.AsEnumerable() 
     .Where(x=>!String.IsNullOrEmpty(myRow.ItemArray[1]) && 
       !String.IsNullOrEmpty(myRow.ItemArray[2]) 
     ) 
     .GroupBy(
     myRow => 
      new 
      { 
      accidentYear = myRow.ItemArray[1].ToString().Trim(), 
      reviewLine = myRow.ItemArray[2].ToString().Trim() 
      }) 
     .Where(grp => grp.Count() > 1) 
     .Select(grp => grp.Key); 

一個更簡潔的方法:

var _duplicateRows = 
    dt.AsEnumerable().Select(
      s=> new { 
       accidentYear = s.ItemArray[1].ToString().Trim(), 
       reviewLine = s.ItemArray[2].ToString().Trim() 
      } 
    ).Where(x=>!String.IsNullOrEmpty(accidentYear) && 
       !String.IsNullOrEmpty(reviewLine) 
    ) 
     .GroupBy(
     myRow =>myRow 
     ) 
     .Where(grp => grp.Count() > 1) 
     .Select(grp => grp.Key); 
+0

我認爲OP可能意味着'ItemArray [1]'本身可能是'null'(並且'ToString'會失敗)。雖然我不確定。顯然,在你的代碼示例中'accidentYear'和'reviewLine'可能是'string.Empty',但它們從不'null'。 –

+0

感謝Nix,一個小的mod!string.IsNullOrEmpty(x.ItemArray [1] .ToString())做了這個訣竅。我沒有考慮首先對它進行過濾,我試圖將它結合在where子句中。 – Tim

1

有時LINQ語法擊敗擴展方法。

var _duplicateRows = from row in dt.AsEnumerable() 
        let accidentYear = row.Field<string>(0) 
        let reviewLine = row.Field<string>(1) 
        where (!string.IsNullOrWhiteSpace(accidentYear) 
          && !string.IsNullOrWhiteSpace(reviewLine)) 
        group row by new { accidentYear, reviewLine } into g 
        where g.Count() > 1 
        select g.Key;