Показать результаты на основе строки поиска в ядре ASP.net - PullRequest
0 голосов
/ 27 июня 2018

У меня есть список именованных моделей, в котором содержится еще один список именованных вариантов. Я хочу выполнить метод getbysearchString, где имена вариантов фильтруются, а строка поиска передается в URL.

Repository.cs

_list.Add(new ModelSearch
            {
                ID = 1,
                Title = "Scorpio",
                Variants=new List<Variant> { new Variant {ID=1,ModelID=1,Title="Scorpio VLX refresh" },
                    new Variant { ID=2,ModelID=1,Title="Scorpio LX refresh" },
                    new Variant { ID=3,ModelID=1,Title="Scorpio3 S2" }
                }

            });

            _list.Add(new ModelSearch
            {
                ID = 2,
                Title = "Bolero",
                Variants = new List<Variant> { new Variant {ID=1,ModelID=2,Title="T4" },
                    new Variant { ID=2,ModelID=2,Title="T4+" },
                    new Variant { ID=3,ModelID=2,Title="T6" },
                    new Variant { ID=3,ModelID=2,Title="T6+" }
                }
            });
//Search method
 public IEnumerable<ModelSearch> GetBySearchString(string searchString)
        {
            return _list.Where(m => m.Title.ToLower().Contains(searchString)|| m.Variants.Contains(searchString)).AsEnumerable();
        }

ModelSearchController.cs

public class ModelSearchController : Controller
    {

        private IRepository _repo;


        public ModelSearchController()
        {
            _repo = new Repository.Repository();
        }

        public IActionResult Search(string searchString)
        {
            var filteredList = _repo.GetBySearchString(searchString);
            return View(filteredList);
        }
    }

Here is my **Index.cshtml** file:

@model IEnumerable<myApp.Models.ModelSearch>

<table class="table">
    <tbody>
        @foreach (var item in Model)
        {
            @foreach (var variant in item.Variants)
            {
                <tr>
                    <td>
                       @Html.DisplayFor(modelItem => variant.Title)
                    </td>


                </tr>
            }
        }
        </tbody>
</table>

Пожалуйста, помогите мне, как этого добиться.

1 Ответ

0 голосов
/ 27 июня 2018

Ваш запрос linq неверен. Это просто нижний регистр заголовка, но не для searchString. Также не проверял название вариантов

public IEnumerable<ModelSearch> GetBySearchString(string searchString)
{
    return _list.Where(
        m => m.Title.Contains(searchString, StringComparison.InvariantCultureIgnoreCase) ||
        m.Variants.Any(v => v.Title.Contains(searchString, StringComparison.InvariantCultureIgnoreCase))
    ).AsEnumerable();
}

UPDATED - отфильтровать варианты, в заголовке которых нет searchString

public IEnumerable<ModelSearch> GetBySearchString(string searchString)
{
    return _list.Where(
        m => m.Title.Contains(searchString, StringComparison.InvariantCultureIgnoreCase) ||
        m.Variants.Any(v => v.Title.Contains(searchString, StringComparison.InvariantCultureIgnoreCase))
    )
    .Select( m =>
        new ModelSearch
        {
            ID = m.ID,
            Title = m.Title,
            Variants = m.Variants.Where(v => v.Title.Contains(searchString, StringComparison.InvariantCultureIgnoreCase)).ToList()
        }
    )
    .AsEnumerable();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...