2012-01-06 2 views
6

Этот метод возвращает общий список, но он имеет несколько условий для выбора. Я просто пишу это, используя if - else if -else if .... so many if else i mean Есть ли более короткий способ сделать это? Спасибо.Linq where clause with multiple conditions

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
    { 
     var db = new requestsDBEntities(); 
     var listPrn = new List<ProductReqNoDate>(); 
     if (!string.IsNullOrEmpty(departmant)) 
     { 
      return (from r in db.requests 
         where r.departmant== departmant 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate , 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
     if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
     { 
      DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
      DateTime dtlastDate = Convert.ToDateTime(lastDate); 
      return (from r in db.requests 
         where r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate 
         select new ProductReqNoDate 
         { 
          departmant= r.departmant, 
          reqNo = r.reqNo , 
          reqDate = r.reqDate, 
          prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
         }).ToList(); 

     } 
    } 
+0

Поскольку linq выполняется при первом обращении к результатам, возможно, вы можете перенести первый «из/где» в var, а затем за пределы ifs, используйте выбор нового запроса на полученном наборе результатов. – Aphelion

ответ

1

1 *

вы можете нашли более гуманного, но я хочу эту помощь (я вещь), но я использую его: вы можете сделать тест из этой функции

List<ProductReqNoDate> yourList = GetRequestsQuery(string departmant, int reqStateID) 

    if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
    { 
     yourdatagrid.Itemsource = yourList.where(a=> a.reqDate <= Datetime.parse(firstDate) & a.reqDate >= Datetime.parse(lastDate)) 
    } 


public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID) 
{ 
    var db = new requestsDBEntities(); 
    var listPrn = new List<ProductReqNoDate>(); 
    if (!string.IsNullOrEmpty(departmant)) 
    { 
     return (from r in db.requests 
        where r.departmant== departmant 
        select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 

    } 
} 

и вы можете примените любое условие в своем первом списке, но не рекомендуется в тяжелом приложении или много информации в базе данных.

2 *

Или вы можете просто сделать первую дату и последнюю дату; например, если дата не установлена, введите первую дату = 01/01/1900 и последнюю дату Datetime.Today и всегда передайте свою дату в запросе linq

+0

ну, на самом деле, мне нужно учитывать так много условий, чтобы получить значение ... public List GetRequestsQuery (string department, int reqStateID, string firstDate, string lastDate, string productName) .... я имею в виду, если все условия истинны, должен дать мне отфильтрованный ответ. Или один из них прав, остальные ложны ... поэтому мне нужно написать все возможности? if (a & b & c & d) else if (a & b & c) else if (a & c & d) else if (b & c & d) else if (a & b) else if (a & c) ... и т. д. :))) – blackraist

0

что-то вроде этого Я не скомпилировал и не проверил его но это должно дать вам ключ.

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate) 
{ 
    using(var db = new requestsDBEntities()) 
    { 

     DateTime dtfirstDate =null; 
     DateTime.TryParse(firstDate,out dtfirstDate); 

     DateTime dtlastDate = null; 
     DateTime.TryParse(lastDate,out dtlastDate); 

     var result = (from r in db.requests 
        where 
         (r.departmant == departmant) 
        || (r.reqDate <= dtlastDate.Value && r.reqDate >= dtfirstDate.Value) 
        select new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        }).ToList(); 
    } 

} 

EDIT:

, если вы хотите использовать не-SQL функции в фильтре затем вызвать ToList() на вашем столе

var result = db.requests.ToList().Where(r => { 

    // do test for what you want 
    // so write a function to work out when you want to filter by 
    // name or date 
    return true; 

}).Select(r => new ProductReqNoDate 
        { 
         departmant = r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter(db.products.Where(p=> p.reqNo == r.reqNo).Select(p=> p.prdctName).FirstOrDefault()) 
        }) 

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

Другим подходом было бы написать его как хранимую процедуру, которая, вероятно, сделает вашего администратора базы данных счастливым.

+0

что, если все параметры не равны нулю, я имею в виду, если все условия истинны, что должно дать мне отфильтрованный ответ. Для этого подхода 1 условие достаточно, чтобы получить значение. – blackraist

6

Вы можете иметь ядро ​​вашего запроса в следующем виде:

var query = from r in db.requests 
select new ProductReqNoDate 
        { 
         departmant= r.departmant, 
         reqNo = r.reqNo , 
         reqDate = r.reqDate , 
         prdctName= stringCutter((from p in db.products 
         where p.reqNo == r.reqNo select p.prdctName).FirstOrDefault()) 
        } 

Затем нанесите if then else:

if (!string.IsNullOrEmpty(departmant)) 
    return query.Where(r=>r.departmant== departmant).ToList(); 
if (!string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate)) 
{ 
     DateTime dtfirstDate = Convert.ToDateTime(firstDate); 
     DateTime dtlastDate = Convert.ToDateTime(lastDate); 
     return query.Where(r=> r.reqDate <= dtlastDate && r.reqDate >= dtfirstDate) 
        .ToList(); 
} 

Это не уменьшает if then else но делает более разумным, чем идти происходит.

+0

@Jani, Salam pesar, kojaee? bia тоже google talk :) –

+1

+1 за ваш фантастический ответ !!!! Avariin :-) – hsalimi

+0

ну, на самом деле, мне нужно учитывать так много условий, чтобы получить значение ... public List GetRequestsQuery (строка demant, int reqStateID, строка firstDate, строка lastDate, string productName) ....я имею в виду, если все условия верны, что должно дать мне отфильтрованный ответ. Или один из них прав, остальные ложны ... поэтому мне нужно написать все возможности? if (a & b & c & d) else if (a & b & c) else if (a & c & d) else if (b & c & d) else if (a & b) else if (a & c) ... и т. д. :))) – blackraist