2016-10-22 54 views
1

您好我正在处理一些ASP.Net MVC控制器的旧代码。有一个1500行代码的控制器方法。当我检查时,我知道有超过50多个LINQ查询是根据特定字段是否为空来从数据库中获取的。检查Linq空条款

只是把它放入角度来看,这里的这种特殊的方法看起来像 -

public ActionResult MyProductList(string Msg, string ProductName, string CompanyName, string DivisionName, string Type, string Form, string Packing, int page = 1, int pageSize = 20){ 
if (CompanyName == null) 
      { 
       CompanyName = ""; 

      } 
      if (ProductName == null) 
      { 
       ProductName = ""; 

      } 
      if (DivisionName == null) 
      { 
       DivisionName = ""; 

      } 
      if (Type == null) 
      { 
       Type = ""; 

      } 
      if (Form == null) 
      { 
       Form = ""; 

      } 
      if (Packing == null) 
      { 
       Packing = ""; 

      } 
    if (CompanyName != "") 
      { 
       var query1 = (from mypdtlist in db.MyProductlist 
           join pdt in db.Product on mypdtlist.Product_ID equals pdt.ID 
           where mypdtlist.User_ID.Equals(UserID) 
           select new ViewModal 
           { 
            ProductName = pdt.ProductName, 
            CompanyName = pdt.CompanyName, 
            DivisionName = pdt.DivisionName, 
            Type = pdt.Type, 
            Form = pdt.Form, 
            Packing = pdt.Packing, 
            MRP = pdt.MRP, 
            DrugName = pdt.DrugName, 
            ID = mypdtlist.ID 
           }).Where(x => x.CompanyName.Contains(CompanyName.ToUpper())).Take(200).ToList(); 
       ViewBag.CompanyName = CompanyName; 
       // list = query.Take(100).Where(x => x.CompanyName.Contains(CompanyName.ToUpper())).ToList(); 
       PagedList<ViewModal> model1 = new PagedList<ViewModal>(query1, page, pageSize); 
       CookieManager.AddToViewBag(HttpContext, ViewBag); 
       return View(model1); 
      } 
      if (ProductName != "") 
      { 
       ViewBag.ProductName = ProductName; 
       var query2 = (from mypdtlist in db.MyProductlist 
           join pdt in db.Product on mypdtlist.Product_ID equals pdt.ID 
           where mypdtlist.User_ID.Equals(UserID) 
           select new ViewModal 
           { 
            ProductName = pdt.ProductName, 
            CompanyName = pdt.CompanyName, 
            DivisionName = pdt.DivisionName, 
            Type = pdt.Type, 
            Form = pdt.Form, 
            Packing = pdt.Packing, 
            MRP = pdt.MRP, 
            DrugName = pdt.DrugName, 
            ID = mypdtlist.ID 
           }).Where(x => x.ProductName.Contains(ProductName.ToUpper())).Take(200).ToList(); 
       //list = query.Take(100).Where(x => x.ProductName.Contains(ProductName.ToUpper())).ToList(); 
       PagedList<ViewModal> model1 = new PagedList<ViewModal>(query2, page, pageSize); 
       CookieManager.AddToViewBag(HttpContext, ViewBag); 
       return View(model1); 
      } 
    //.... After a lot more similar condition checks and LINQ queries 
    else if (ProductName != "" && CompanyName != "" && DivisionName != "" && Type != "" && Form != "" && Packing != "") 
      { 
       ViewBag.ProductName = ProductName; 
       ViewBag.CompanyName = CompanyName; 
       ViewBag.DivisionName = DivisionName; 
       ViewBag.Type = Type; 
       ViewBag.Form = Form; 
       ViewBag.Packing = Packing; 
       var query51 = (from mypdtlist in db.MyProductlist 
           join pdt in db.Product on mypdtlist.Product_ID equals pdt.ID 
           where mypdtlist.User_ID.Equals(UserID) 
           select new ViewModal 
           { 
            ProductName = pdt.ProductName, 
            CompanyName = pdt.CompanyName, 
            DivisionName = pdt.DivisionName, 
            Type = pdt.Type, 
            Form = pdt.Form, 
            Packing = pdt.Packing, 
            MRP = pdt.MRP, 
            DrugName = pdt.DrugName, 
            ID = mypdtlist.ID 
           }).Where(x => x.ProductName.Contains(ProductName.ToUpper()) && x.CompanyName.Contains(CompanyName.ToUpper()) && x.DivisionName.Contains(DivisionName.ToUpper()) && x.Type.Contains(Type.ToUpper()) && x.Form.Contains(Form.ToUpper()) && x.Packing.Contains(Packing.ToUpper())).Take(300).ToList(); 
       PagedList<ViewModal> model = new PagedList<ViewModal>(query51, page, pageSize); 
       // List<Product> pdt = db.Product.Where(x => x.ProductName.Contains(ProductName.ToUpper()) && x.CompanyName.Contains(CompanyName.ToUpper()) && x.DivisionName.Contains(DivisionName.ToUpper()) && x.Type.Contains(Type.ToUpper()) && x.Form.Contains(Form.ToUpper()) && x.Packing.Contains(Packing.ToUpper())).Take(300).ToList(); 
       // PagedList<Product> model = new PagedList<Product>(pdt, page, pageSize); 
       //var list = db.Product.Take(20).ToList(); 

       return View(model); 
      } 
} 

我的道歉为坏的编码,但我没有这样做的代码。该代码基本上使用相同的方法来过滤产品。
该方法的所有参数实际上是可选的,因此它们都可以为空。所以代码基本上是比较特定参数是否为空。如果它为空,则不要将其包含在Where子句中。

现在,而不是使用50+条件的非空参数的各种组合,我想将此代码转换为单个LINQ调用。

所以我的问题是,我如何检查Where子句中的特定参数是否为null,如果它为null,那么从Where子句中消除它的条件?什么是最优化和最少的代码行呢?

我试过了什么?
我尝试添加空校验Where子句本身并试图做这样的事情 -

Where((ProductName!=null && x.ProductName.Contains(ProductName.ToUpper())) && (CompanyName!=null && x.CompanyName.Contains(CompanyName.ToUpper())) 

但我不认为这是一个正确的状态,它没有给我任何结果的。

+0

所以这应该在http://codereview.stackexchange.com/发布。 – mybirthname

+1

如果你坚持在Where中嵌入条件(我不建议这样做,因为它会产生一个效率很低的SQL),那么正确的方法是'(param == null || condition(param))' –

回答

2

您可以在初始声明之后的条件中添加条件,只是不要在之前调用ToList()。

所以第一部分是:

var query1 = (from mypdtlist in db.MyProductlist 
          join pdt in db.Product on mypdtlist.Product_ID equals pdt.ID 
          where mypdtlist.User_ID.Equals(UserID) 
          select new ViewModal 
          { 
           ProductName = pdt.ProductName, 
           CompanyName = pdt.CompanyName, 
           DivisionName = pdt.DivisionName, 
           Type = pdt.Type, 
           Form = pdt.Form, 
           Packing = pdt.Packing, 
           MRP = pdt.MRP, 
           DrugName = pdt.DrugName, 
           ID = mypdtlist.ID 
          }) 

现在,您可以附加额外的条件是这样的:

if (!string.IsNullOrWhiteSpace(ProductName)) 
    query1 = query1.Where(x => x.ProductName.Contains(ProductName.ToUpper())); 

而当所有的条件都做了,只是ToList()返回:

return query1.ToList(); 
+0

@ mybirthname正如JanneP写道:“当所有的条件都完成了” - 例如当查询,分页等已被添加到查询时,实现查询。 – Lucero