Linq where子句具有多个条件

时间:2012-01-06 08:25:03

标签: linq where conditional-statements

此方法返回通用列表,但它有多个条件可供选择。 我只是写这个用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 个答案:

答案 0 :(得分: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,但会更加明智,会发生什么。

答案 1 :(得分: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();

    }
}

您可以在第一个列表中应用任何条件,但不建议使用havy应用程序或数据库中的许多信息。

2 *

或者您可以制作第一个日期和最后一个日期;例如,如果没有设置日期,请将第一个日期= 01/01/1900和最后一个日期Datetime.Today,并始终在linq查询中传递您的日期

答案 2 :(得分: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();
    }

 }

编辑:

如果你想在你的过滤器中使用非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())
                   })

这个问题就是你要将整个表加载到内存中,如果你不经常更改它的值,如果它不是太大,那就很好。

另一种方法是将其编写为存储过程,这可能会让您的DBA满意。