C# 在Linq where子句中检查Null
大家好,我正在编写ASP.NETMVC控制器的一些旧代码。有一个控制器方法,其中包含1500行代码。当我检查时,我知道有超过50个LINQ查询是根据特定字段是否为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
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();