2013-12-12 83 views
1

以下LINQ查詢正試圖從數據表中刪除行,如果「培訓」或者是「電子郵件」或「PreferredName」列LINQ查詢不工作 - C#

IEnumerable<DataRow> query = from rows in returnTable.AsEnumerable() 
           where !rows.Field<string>("Email").Contains("Training") || 
           !rows.Field<string>("PreferredName").Contains("Training") 
           select rows; 

    DataTable dt1 = query.CopyToDataTable<DataRow>(); 

實際上它不過濾行從returnTable變量。我做錯了嗎?

+0

你會得到什麼結果? –

+2

你在你想要完成的事情中使用AND,但在你的代碼中使用了'||'。 –

+0

@ChrisLava - 與'returnTable'中的'dt1'相同的結果。似乎它只是忽略'where'子句 –

回答

2

「電子郵件」和「首選名稱」列不包含「培訓」

使用&&代替||

IEnumerable<DataRow> query = 
    from rows in returnTable.AsEnumerable() 
    where !rows.Field<string>("Email").Contains("Training") && 
      !rows.Field<string>("PreferredName").Contains("Training") 
    select rows; 

或者由於De Morgan's law,這相當於:

IEnumerable<DataRow> query = 
    from rows in returnTable.AsEnumerable() 
    where !(rows.Field<string>("Email").Contains("Training") || 
      rows.Field<string>("PreferredName").Contains("Training")) 
    select rows; 

注意,兩個條件都包裹在括號,並且整個表達時取消。

+0

使用De Morgan法則的選項用於過濾記錄。謝了哥們! –

1

如果您想篩選出其中列不包括「培訓」,然後更改或(||)到AND(& &)。

IEnumerable<DataRow> query = from rows in returnTable.AsEnumerable() 
          where !rows.Field<string>("Email").Contains("Training") && 
          !rows.Field<string>("PreferredName").Contains("Training") 
          select rows;