C# 在Linq where子句中检查Null

C# 在Linq where子句中检查Null,c#,asp.net-mvc,linq,C#,Asp.net Mvc,Linq,大家好,我正在编写ASP.NETMVC控制器的一些旧代码。有一个控制器方法,其中包含1500行代码。当我检查时,我知道有超过50个LINQ查询是根据特定字段是否为null从数据库中获取的 让我们来看看这个特殊的方法是什么样子的- public ActionResult MyProductList(string Msg, string ProductName, string CompanyName, string DivisionName, string Type, string Form, st

大家好,我正在编写ASP.NETMVC控制器的一些旧代码。有一个控制器方法,其中包含1500行代码。当我检查时,我知道有超过50个LINQ查询是根据特定字段是否为null从数据库中获取的

让我们来看看这个特殊的方法是什么样子的-

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条件,只是之前不要调用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():


如果你坚持把条件嵌入
Where
(我不建议这样做,因为它会生成一个效率很低的SQL),那么正确的方法是
(param==null | | condition(param))
@mybirthname,正如JanneP写的:“当所有条件都完成时”-例如,当查询,已将分页等添加到查询中,以实现查询。
if (!string.IsNullOrWhiteSpace(ProductName))
    query1 = query1.Where(x => x.ProductName.Contains(ProductName.ToUpper()));
return query1.ToList();