Добавление фильтра для просмотра бритвы в .ThenInclude для модели - PullRequest
1 голос
/ 10 ноября 2019

Я хочу добавить фильтр выпадающего меню для представления, которое содержит клиентов и проекты. Мой фильтр работает с одним представлением модели (Project), но я не знаю, как применить его к моему действию OnGet, чтобы результирующее представление фильтровалось по подмодели (Project).

У меня естьдобавил код фильтра в действие OnGet для модели Project, но не знаю, куда включить переменную, которая будет обрабатывать фильтр поиска.

Файл Index.cshtml.cs (для примененияфильтр, когда пользователь нажимает кнопку «Поиск»)

        [BindProperty]
        public List<ClientVM> ClientVMList { get; set; }

        //added for filter - start
        public string CurrentFilter { get; set; }
        //added for filter - end

        //added for filter - string searchString
        public async Task<IActionResult> OnGet(string searchString)
        {
            //added for filter - start
            CurrentFilter = searchString;
            IQueryable<Project> dsmIQ = from s in _context.Project
                                        select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                dsmIQ = dsmIQ.Where(s => s.DSM.Contains(searchString));
            }
            //added for filter - end

            var clientlist = _context.Client
                .Include(c => c.ClientComments)
                .Include(p => p.Projects)
                    .ThenInclude(pc => pc.ProjectComments).ToList();

            ClientVMList = new List<ClientVM>();

            foreach (var item in clientlist)
            {
                ClientVM clientVM = new ClientVM()
                {
                    Projectlist = new List<ProjectVM>(),
                };
                clientVM.ClientName = item.ClientName;
                if (item.ClientComments != null && item.ClientComments.Any())
                {
                    clientVM.ClientStatusComment = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().ClientStatusComment;
                    clientVM.ClientRAG = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().ClientRAG;
                    clientVM.ClientStatusCommentId = item.ClientComments.OrderByDescending(cc => cc.LastUpdateDate).First().Id;
                }
                else
                {
                    clientVM.ClientStatusComment = "No Status Comment";
                }
                foreach (var projectItem in item.Projects)
                {
                    ProjectVM projectVM = new ProjectVM
                    {
                        ProjectPID = projectItem.PID,
                        ProjectName = projectItem.ProjectName,
                        ProjectStatusName = projectItem.ProjectStatus,
                        ForecastOwnerLongName = projectItem.ForecastOwner,
                        DSMLongName = projectItem.DSM,
                    };
                    if (projectItem.ProjectComments != null && projectItem.ProjectComments.Any())
                    {
                        projectVM.ProjectStatusComment = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().ProjectStatusComment;
                        projectVM.RAGStatusName = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().ProjectRAG;
                        projectVM.ProjectStatusCommentId = projectItem.ProjectComments.OrderByDescending(pc => pc.LastUpdateDate).First().Id;

                    }
                    else
                    {
                        projectVM.ProjectStatusComment = "No Status Comment";
                    }
                    clientVM.Projectlist.Add(projectVM);
                }

                ClientVMList.Add(clientVM);
            }

            return Page();

Рабочий код для отдельной модели (Project)

        public IList<Project> Project { get;set; }
        //added for filter - start
        public string CurrentFilter { get; set; }
        //added for filter - end

        //added for filter - string searchString
        public async Task OnGetAsync(string searchString)
        {
            //added for filter - start
            CurrentFilter = searchString;
            IQueryable<Project> dsmIQ = from s in _context.Project
            .Include(p => p.Client)
                                        select s;
            if (!String.IsNullOrEmpty(searchString))
            {
                dsmIQ = dsmIQ.Where(s => s.DSM.Contains(searchString));
            }
            Project = await dsmIQ.AsNoTracking().ToListAsync();
            //added for filter - end

            //            Project = await _context.Project
            //               .Include(p => p.Client).ToListAsync();
        }
    }
}

Код на странице Index.cshtml:

<form asp-page="./Index" method="get">
    <div class="form-actions no-color">
        <p>
            My projects only:
            <input type="text" name="SearchString" value="@Model.CurrentFilter" />
            <input type="submit" value="Search" class="btn btn-primary" /> |
            <a asp-page="./CommentGroupings/Index">Back to full List</a>
        </p>
    </div>
</form>

My View перечисляет все проекты Клиента с соответствующими комментариями. Я хочу, чтобы пользователь мог искать все проекты, в которых содержится его имя (поле DSM). Как я могу включить IQueryable<Project> dsmIQ = from s in _context.Project в .Include(p => p.Projects) моего var clientlist = _context.Client?

...