MVC5如何在控制器中过滤“等于或小于”

时间:2019-04-23 20:10:41

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

我对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));

我觉得自己快要到了,但是还不太了解如何使用<=的{​​{1}}值来intsearchstring是一个OnHand字段。我还需要将int?设为searchString吗?我的过滤器正确吗?


更新

这是修改后的控制器代码。 。截至目前

int

3 个答案:

答案 0 :(得分:1)

将我们的对话浓缩为一个答案,您表示您对以下代码行有疑问:

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

这里有几个问题。首先,HasValue返回一个bool,因此我们无法对其进行<比较。相反,如果HasValuetrue,那么我们想对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)

答案 1 :(得分:0)

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

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

    }

答案 2 :(得分:0)

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