我有一个控制器,比如:
public ActionResult Index(string xyear, string xmonth)
{
var query = db.Masters.Include(m => m.MasterOrigin)
.Where(c => (c.Year == xyear) && (c.Month == xmonth));
return View(query.ToList());
}
我想在单击按钮时加载列表。当xyear
为空并且xmonth
被设置为1
时。。。然后该列表将用Month = 1
加载所有数据。或者,如果xyear
设置为2019
,xmonth
设置为空。。。然后该列表将用Year = 2019
加载所有数据。ff.
有人对这个案子有想法吗
非常感谢
尝试这个
public ActionResult Index(string xyear, string xmonth)
{
var query = db.Masters.Include(m => m.MasterOrigin)
.Where(c => (c.Year == xyear || xyear == null) && (c.Month == xmonth || xmonth == null));
return View(query.ToList());
}
为什么不根据null链接where
?
var query = db.Masters.Include(m => m.MasterOrigin).AsQueryable();
if (xyear != null && xMonth == null)
{
query = query.Where(x => x.Year == xyear);
}
if (xyear == null && xMonth != null)
{
query = query.Where(x => x.Month == xMonth);
}
var result = query.ToList();
return View(result);
或者如果你确定当xYear != null
,xMonth == null
然后
if (xyear != null)
{
query = query.Where(x => x.Year == xyear);
}
if (xMonth != null)
{
query = query.Where(x => x.Month == xMonth);
}
var result = query.ToList();
return View(result);
尝试类似的东西
var predicateBuilder = PredicateBuilder.New<Master>(true);
predicateBuilder = xyear != null : predicateBuilder.And(c => c.Year == xyear):
predicateBuilder;
predicateBuilder = xmonth != null : predicateBuilder.And(c => c.Month == xmonth) :
predicateBuilder;
var query = db.Masters.Include(m => m.MasterOrigin)
.Where(peridicateBuilder);
return View(query.ToList());
这假设您使用NuGet PredicateBuilder包。
仅当参数不是null
时,才会在Month或Yearwhere
子句中添加。
没有谓词生成器的替代方案是:
var query = db.Masters.Include(m => m.MasterOrigin);
if (xyear =! null)
{
query = query.Where(c => (c.Year == xyear));
}
if (xmonth = !null)
{
query = query.Where(c => (c.Year == xmonth));
}
return View(query.ToList());