Linq, где предложение с несколькими условиями - PullRequest
6 голосов
/ 06 января 2012

этот метод возвращает общий список, но имеет несколько условий для выбора.Я просто пишу это используя 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();

        }
    }

Ответы [ 3 ]

6 голосов
/ 06 января 2012

Суть вашего запроса может быть следующей:

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

1 голос
/ 06 января 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();

    }
}

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

2 *

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

0 голосов
/ 06 января 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())
                   })

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

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

...