【问题标题】:MVC5 How to filter for 'equal to or less than' in ControllerMVC5如何在控制器中过滤“等于或小于”
【发布时间】:2019-09-13 01:57:50
【问题描述】:

我对 MVC5 和 C# 都很陌生。我有一个耗材视图(列表)。我想对 int 字段“Onhand”进行过滤。其中,用户可以在过滤文本框中输入一个数字,我们会带回所有等于或小于手头指定数字的供应。

这是我观点的相关部分:

<form asp-controller="Movies" asp-action="Index">
<p>
    Search Supplies: <input type="text" name="SearchString">
    <input type="submit" value="Filter" />
</p>
<p>
</p>
</form>

这是我努力让控制器正常工作的地方

var supplies = db.ICS_Supplies
    .OrderByDescending(g => g.Supplies_ID)
    .ToList();

var catalogs = supplies
    .Where(s => s.OnHand.HasValue<(searchString ?? string.Empty));

var pageNumber = page ?? 1;
return View(catalogs.ToPagedList(pageNumber, 10));

具体来说。 .这一行在这里:

var catalogs = supplies
    .Where(s => s.OnHand.HasValue<(searchString ?? string.Empty));

我觉得我快到了,但不太了解如何使用&lt;= 和int 的searchstring 值到达那里。 OnHand 是一个 int? 字段。我还需要将searchString 设为int 吗?我的过滤器是否正确?


更新

这是修改后的控制器代码。 .到现在

public ActionResult Reorder(string searchString, int? page)
{
    var supplies = db.ICS_Supplies
        .OrderByDescending(g => g.Supplies_ID)
        .ToList();

    var catalogs = supplies
        .Where(s => 
            s.OnHand.HasValue &&
            (searchString == null || s.OnHand.Value <= int.Parse(searchString)));

    var pageNumber = page ?? 1;

    return View(catalogs.ToPagedList(pageNumber, 10));
}

【问题讨论】:

  • HasValue 如果有值则返回true,并且仅适用于可为空的类型(您声明OnHand 是int,但它必须是int?) .要将其与string 进行比较,您应该将字符串转换为int。所以你最终会得到类似的东西:supplies.Where(s =&gt; s.OnHand.HasValue &amp;&amp; searchString != null &amp;&amp; s.Value &lt;= int.Parse(searchString))
  • 或者如果你想在searchString是null的情况下返回值,那就是s.OnHand.HasValue &amp;&amp; (searchString == null || s.Value &lt;= int.Parse(searchString))。虽然如果searchString不是int,int.Parse会抛出异常,所以使用TryParse会更好。
  • @RufusL。谢谢您的回复。我明白你在说什么。我试图实现 var catalogs = supply.Where(s => s.OnHand.HasValue && (searchString == null || s.Value
  • @RufusL - 我解决了 searchString 从 int 到 string 的转换。但仍然存在“没有价值定义”问题
  • 您确定执行查询时字符串不是null 吗?这是我能看到它会返回所有记录的唯一情况。

标签: c# linq asp.net-mvc-5


【解决方案1】:

将我们的对话浓缩为一个答案,您说您对这行代码有疑问:

var catalogs = supplies.Where(s => s.OnHand.HasValue < (searchString ?? string.Empty));

这里有几个问题。首先,HasValue 返回一个bool,所以我们不能与它进行&lt; 比较。相反,如果HasValue 是true,那么我们要对Value 属性进行比较:

var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value < searchValue)

但是,我们需要使用int 代替上面的searchValue,并且在您的原始代码中您使用的是字符串。所以我们需要将字符串转换为int,最安全的方法是int.TryParse,它返回一个bool表示成功,如果成功则将out参数设置为转换后的值。

既然你说如果字符串是null,我们应该返回所有的值,那么我们应该从字符串中创建一个值,如果它是null,它将是最大值。所以我们可以这样做:

int searchValue;

// If searchString is null (or not an int), then set our searchValue to int.MaxValue
if (!int.TryParse(searchString, out searchValue)) searchValue = int.MaxValue;

现在我们可以使用这个searchValue 来过滤我们的查询:

var catalogs = supplies.Where(s => s.OnHand.HasValue && s.OnHand.Value <= searchValue)

【讨论】:

  • 这是一个很好的答案,作为一个小小的改进,我建议他更新他的表单以使用:Search Supplies: &lt;input type="number" name="SearchString"&gt;。这将消除完全解析 SearchString 变量的需要。
  • 感谢 Rufus L,感谢您为此付出的所有时间和精力。您的回答帮助我了解正在发生的事情和原因,我非常感谢。过滤器现在正在工作。我会将其标记为已解决。分页仍然存在问题。当我转到下一页结果时,过滤器失败并且所有结果都会再次显示,无论过滤器如何。但是,我将从一个新问题开始。谢谢!
【解决方案2】:

这不是答案...但旨在帮助您,这很难阅读...

 public ActionResult Reorder(string searchString, int? page)
    {
        /// this has performance issues
        var supplies = db.ICS_Supplies.OrderByDescending(g => g.Supplies_ID).ToList();

         // problem here is you are checking for null, in a c# way and not linq
         var catalogs = supplies.Where(s => s.OnHand.HasValue && (searchString == null || s.Value <= int.Parse(searchString)));

        var pageNumber = page ?? 1;
        return View(catalogs.ToPagedList(pageNumber, 10));

    }

这需要更多的工作,但更容易阅读......希望对你有所帮助

 public ActionResult Reorder(string searchString, int? page)
    {
        /check your string first
        if(searchString == null)
           searchString = "";

        ///from the below im guessing searchString is an int
        var int value = int.Parse(searchString);

        var supplies = db.ICS_Supplies.Where(x => x.OnHand != null 
                                && searchString.Contians(x.FieldName) 
         .OrderByDescending(x => x.Supplies_ID)
         .ToList(); // to list forces a pull of the results

       //other stuff to work on
        var pageNumber = page ?? 1;
        return View(catalogs.ToPagedList(pageNumber, 10));

    }

【讨论】:

    【解决方案3】:
    public ActionResult Reorder(string searchString, int? page)
    {   
    int convertInt = 0;
    
    var catalogs = db.ICS_Supplies
            .OrderByDescending(g => g.Supplies_ID)
            .ToList();
    
    if (Int32.TryParse(searchString, out convertInt))
    {
       catalogs = supplies
                .Where(s => 
                    s.OnHand.HasValue &&
                    s.OnHand.Value <= convertInt);
    }
     var pageNumber = page ?? 1;
    
     return View(catalogs.ToPagedList(pageNumber, 10));
    }
    

    【讨论】:

      猜你喜欢
      • 2016-04-17
      • 2012-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-27
      • 2011-01-25
      • 2015-09-04
      相关资源
      最近更新 更多