MVC5 Как фильтровать для «равно или меньше» в контроллере - PullRequest
0 голосов
/ 23 апреля 2019

Я довольно новичок в 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));

Мне кажется, что я почти на месте, но не совсем понимаю, как туда добраться с <= 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));
}

Ответы [ 3 ]

1 голос
/ 24 апреля 2019

Сконцентрировав нашу беседу в ответ, вы заявили, что у вас возникла проблема с этой строкой кода:

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

Здесь есть несколько проблем.Во-первых, HasValue возвращает bool, поэтому мы не можем сделать сравнение < с ним.Вместо этого, если 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)
0 голосов
/ 24 апреля 2019
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));
}
0 голосов
/ 24 апреля 2019

Это не ответ ... но предназначен, чтобы помочь вам, это трудно читать ...

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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...