Предложение Linq where с несколькими условиями

этот метод возвращает общий список, но он имеет несколько условий для выбора. Я просто пишу это, используя if - else if -else if.... так много, если еще я имею в виду. Есть ли более короткий способ сделать это? Спасибо.

    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();

        }
    }

person blackraist    schedule 06.01.2012    source источник
comment
Поскольку linq выполняется при первом доступе к результатам, возможно, вы могли бы поместить первое «откуда/откуда» в переменную, а затем вне ifs использовать запрос выбора нового для полученного набора результатов.   -  person Myrtle    schedule 06.01.2012


Ответы (3)


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

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, но делает более разумным то, что происходит.

person Saeed Amiri    schedule 06.01.2012
comment
ну на самом деле, мне нужно учитывать так много условий, чтобы получить значение... public List‹ProductReqNoDate› 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)...и т.д. ?? :))) - person blackraist; 06.01.2012
comment
@blackraist, все, о чем я могу думать, это создание класса построителя запросов для запроса выражения по вашему условию, таким образом, ваш код становится более читаемым, также, если это не linq2sql, вы можете использовать отражение и простой счетчик (в базе 2) для создания Ваш запрос. - person Saeed Amiri; 06.01.2012

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

person Akrem    schedule 06.01.2012
comment
ну на самом деле, мне нужно учитывать так много условий, чтобы получить значение... public List‹ProductReqNoDate› 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)...и т.д. ?? :))) - person blackraist; 06.01.2012

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

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();
    }

 }

РЕДАКТИРОВАТЬ:

если вы хотите использовать не-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())
                   })

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

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

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