2013-09-13 5 views
2

Ситуация: Запрос Linq к datatable с несколькими предложениями where. Фильтр для предложения where используется из нескольких ComboBox, таких как учетная запись, год, месяц и т. Д. Результат запроса будет сохранен в другой тип данных.Linq to Datatable with multiple where clauses

У меня есть разные запросы, как ...

 //Filter Year 
      var query = from myRow in ds.Tables["tblOriginal"].AsEnumerable() 
         where myRow.Field<DateTime>("Datum").Year == int.Parse(cmbFilterYear.Text) 
         select myRow; 
      ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable()); 

... У меня есть шесть из этих запросов Linq, которые я хочу иметь в одном запросе с различными, где положения с использованием

...&&... 

Он работает, если все ComboBoxes заполнены значениями.

Но это не сработает, если, например, только 4 из 6 ComboBoxes заполнены значениями.

Есть ли возможность поставить «IF ...» в «где» -блокировку запроса?

Я уже пытался использовать строковый конструктор для установки переменной для предложения where, но я не могу преобразовать ее в правильное логическое.

Любая идея оценивается.

ответ

4

Вместо этого используйте синтаксис метода. Это позволяет построить запрос шаг за шагом:

var query = ds.Tables["tblOriginal"].AsEnumerable(); 

int year; 
if (Int32.TryParse(cmbFilterYear.Text, out year)) // condition for adding filter 
    query = query.Where(r => r.Field<DateTime>("Datum").Year == year); 

// repear for other conditions 

ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable()); // execute query 
0

Если вы не хотите использовать синтаксис метода путь (как показано @lazyberezovsky), вы можете попробовать что-то, как показано ниже:

//Filter Year 
var query = from myRow in ds.Tables["tblOriginal"].AsEnumerable() 
      where (string.IsNullOrEmpty(cmb1.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb1.Text)) 
       && (string.IsNullOrEmpty(cmb2.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb2.Text)) 
       && (string.IsNullOrEmpty(cmb3.Text) || myRow.Field<DateTime>("Datum").Year == int.Parse(cmb3.Text)) 
      select myRow; 
ds.Tables["tblFilteredData"].Merge(query.CopyToDataTable()); 

Здесь string.IsNullOrEmpty(cmb1.Text) - ваше нецензурное состояние. Если пустота не является правильным нецензурным условием для вашего случая, замените его на любые сюиты, которые вам нужны.