嗨,我正在写一些ASP.Net MVC控制器的旧代码。有一个包含1500行代码的Controller方法。当我检查时,我了解到,根据某个特定字段是否为null,从数据库中获取的50+ 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);
}
}
我为错误的编码道歉,但我没有做代码。代码基本上使用相同的方法过滤产品。
该方法的所有参数实际上都是可选的,因此它们都可以是空的。因此,代码基本上是比较特定参数是否为空的。如果为null,则不要将其包含在Where子句中。
现在,我不想对null参数的各种组合使用50+条件,而是将这段代码转换为一个LINQ调用。
因此,我的问题是,如何检查某个参数在Where子句中是否为null,如果为null,则从Where子句中删除它的条件?做这件事的最优化和最少的代码行是什么?
我试了什么?
我试图在Where子句本身中添加null检查,并尝试这样做-
Where((ProductName!=null && x.ProductName.Contains(ProductName.ToUpper())) && (CompanyName!=null && x.CompanyName.Contains(CompanyName.ToUpper()))
但我不认为这是一个正确的条件,这并没有给我任何结果。
发布于 2016-10-22 03:12:46
您可以在初始声明之后将条件添加到查询中,只是之前不要调用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();
https://stackoverflow.com/questions/40191326
复制