【问题标题】:MVC LINQ SELECT ALL when parameter is empty参数为空时的 MVC LINQ SELECT ALL
【发布时间】:2020-02-21 12:55:01
【问题描述】:

我有一个类似的控制器:

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.

有人对这个案例有想法吗?
非常感谢

【问题讨论】:

  • 谓词构建器是一种方法。如果你谷歌它有很好的例子。我使用 albahari(请参阅 NuGet 上的 here
  • 这里的概念有缺陷,请重新考虑您真正想要做什么。但是您正在寻找一个字符串数组并在您的 linq 表达式中使用 contains
  • 添加了答案

标签: asp.net-mvc entity-framework linq model-view-controller


【解决方案1】:

试试这个

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 而不是所有年份的记录。与月份相同。
  • @PeterSmith,有什么想法吗?
  • 如果这是您所期望的,我认为这里的概念存在缺陷
【解决方案2】:

试试类似的东西

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,这只会在月份或年份where 子句中添加。

没有谓词构建器的替代方法是:

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());

【讨论】:

  • 这太复杂了
  • 你有更简单的选择吗?我很想看看。
  • var query = db.Masters.Include(m => m.MasterOrigin) .Where(c => c.Year == null) && c.Month == "1")); - 正是要求
  • @Morpheus 这只是一个示例,Year 永远不会为空。该问题还继续询问“或者,如果 xyear 设置为 2019 并且 xmonth...”您的答案将始终返回一个空列表。
  • 所以使用 string.IsNullOrEmpty() 显然数据必须匹配这个条件
【解决方案3】:

为什么不根据 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);

【讨论】:

  • 为什么是AsQueryable
  • @PauloMorgado 哦,对不起,习惯的力量,但不管有没有它都会返回IQueryable
猜你喜欢
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 2017-08-04
  • 2016-03-05
  • 1970-01-01
  • 2012-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多