2013-12-12 8 views
1

Следующий запрос LINQ пытается удалить строки из DataTable, если «Обучение» либо в «Отправить» или «столбцы 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

Вы используете И в том, что вы пытаетесь выполнить, но '||' в вашем коде. –

+0

@ChrisLava - те же результаты в 'dt1', что и в' returnTable'. Похоже, что он просто игнорирует предложение 'where' –

ответ

2

и колонка "Отправить" "Preferred Name" НЕ содержат "Обучение"

использование && вместо ||:

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

Опция с использованием закона Де Моргана работала для фильтрации записей. Спасибо друг! –

1

Если вы хотите отфильтровать, где обе колонны не включают в себя «Обучение», а затем изменить OR (||) к и (& &).

IEnumerable<DataRow> query = from rows in returnTable.AsEnumerable() 
          where !rows.Field<string>("Email").Contains("Training") && 
          !rows.Field<string>("PreferredName").Contains("Training") 
          select rows; 
Смежные вопросы