несколько условий Linq продлен - PullRequest
1 голос
/ 06 января 2012

Мне нужно учитывать несколько условий, чтобы получить значение.Я имею в виду, если все условия верны, это должно дать мне отфильтрованный ответ.Или одно из них верно, остальные ложные ... поэтому мне нужно написать все возможности ??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) ... и т. д. ??:))) Есть ли более короткий способ сделать это?

    public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate, string productName)
    {
        var db = new requestDBEntities();
        bool dp = !string.IsNullOrEmpty(departmant);
        bool pr = !string.IsNullOrEmpty(productName);
        bool tm = !string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate);
        bool rs = reqStateID > 0 ? true : false;

        var query = (from r in db.requests
                     select new ProductReqNoDate
                     {
                         departmant = r.departmant,
                         reqNo = r.reqNo,
                         reqDate = r.reqDate,
                         productName = (from p in db.products where p.reqNo == r.reqNo select p.productName).FirstOrDefault()
                     }).ToList();
        if (dp & pr & tm & rs)
        {
            var rState = (from ta in db.reqStates
                          where ta.reqStateID == reqStateID && ta.isActive == true
                          select ta.reqNo).ToList();
            var prName = (from p in db.products where p.productName.Contains(productName) select p.reqNo).ToList();
            DateTime dtfirstDate = Convert.ToDateTime(firstDate);
            DateTime dtlastDate = Convert.ToDateTime(lastDate);

            return query.Where(
                r => rState.Contains(r.reqNo)  //find by Request State
                  && r.departmant == departmant  //find by Departmant
                   && (r.reqDate >= dtfirstDate && r.reqDate <= dtlastDate) //find by Date
                    && prName.Contains(r.reqNo) //Find By Product Name
                    ).ToList();

        }
        else if (dp & pr & tm) { /*return query.Where(...} */}
        else if (pr & tm & rs) { /*return query.Where(...} */}
        else if (dp & pr && rs) { /*return query.Where(...} */}
        else if (dp & pr) { /*return query.Where(...} */}
        //else if ...etc
    }

Ответы [ 2 ]

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

Просто добавьте одно условие Where за один раз

public List<ProductReqNoDate> GetRequestsQuery(string departmant, int reqStateID, string firstDate, string lastDate, string productName)
{
    var db = new requestDBEntities();
    bool dp = !string.IsNullOrEmpty(departmant);
    bool pr = !string.IsNullOrEmpty(productName);
    bool tm = !string.IsNullOrEmpty(firstDate) && !string.IsNullOrEmpty(lastDate);
    bool rs = reqStateID > 0 ? true : false;

    var query = (from r in db.requests
                 select new ProductReqNoDate
                 {
                     departmant = r.departmant,
                     reqNo = r.reqNo,
                     reqDate = r.reqDate,
                     productName = (from p in db.products where p.reqNo == r.reqNo select p.productName).FirstOrDefault()
                 }).AsQueryable();  //AsQueryable is not always needed, but it shouldn't hurt and I don't feel like checking for this example.


    if (dp)
    {
        query = query.Where(q => /*condition*/);
    }

    if (pr)
    {
        query = query.Where(q => /*condition*/);
    }

    if (tm)
    {
        query = query.Where(q => /*condition*/);
    }

    if (rs)
    {
        query = query.Where(q => /*condition*/);
    }

    return query.ToList();
}
1 голос
/ 06 января 2012

Вы можете построить выражение с помощью Expression.And , например:

private Expression<Func<Request, bool>> GetPredicate(FilterDto filter)
{
  Expression<Func<Request, bool>> predicate = r => r.ID == r.ID;

  if (filter.Department.HasValue)
    predicate = predicate.And(r => r.Department == filter.Department.Value);
  if (filter.FirstDate.HasValue)
    predicate = predicate.And(r => (r.reqDate >= filter.FirstDate.Value));
  if (filter.LastDate.HasValue)
    predicate = predicate.And(r => (r.reqDate <= filter.LastDate.Value));

  /* ... */

  return predicate;
}

Примечание: я поставил r => r.ID == r.ID здесь в качестве первого выражения, просто чтобы иметь выражение для начала.Этот фрагмент не полностью охватывает ваш код, но я думаю, что этого достаточно в качестве примера.

Используйте выражение в return query.Where(expression).ToList().

...