当参数为空时,MVC LINQ SELECT ALL



我有一个控制器,比如:

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设置为2019xmonth设置为空。。。然后该列表将用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 != nullxMonth == 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());

最新更新