我正在寻求有关构建搜索栏的帮助。我在这里有 3 个数据库表:Case
-> Exhibit
-> Tasking
。Case
是Exhibit
的父母并且Exhibit
是Tasking
的父母。我有一个表格,其中显示了Taskings
他们的父母 ID ( Exhibit
) 和祖父母 ID ( Case
) 的列表中的信息。
我希望能够Taskings
根据Case
ID 进行搜索。这是我当前的解决方案(作品),显示和搜索速度很慢,有 2000 个任务。
我认为这是因为循环中有 2 个 find 语句。这IsMatchedTasking
也是一个复杂的查询,我无法仅使用 linq 语句编写。
理想的情况是将一个查询存储为IQueryable
保留所有父关系的查询,并将其传递到搜索中。但由于我使用PagedList
的是,当它传递到视图中时,它将摆脱父关系。
关于如何正确执行此操作而无需查看 db 上下文 3 次的任何建议(在 db 中查询Taskings
、在 db 中过滤搜索并检查 db 以显示父属性)?
public ActionResult GetNew(int? page, int? pageSize, string searchString)
{
int pageNumber = page ?? 1;
var currUser = _userManager.FindByNameAsync(User.Identity.Name).Result;
var ps = Util.SetSessionPageSize(10, pageSize, HttpContext, "taskingGetNewPageSize");
var output = new List<TaskingViewModel>();
foreach (var tsk in _dbContext.Taskings) {
if (currUser.IsMatchedTasking(tsk, _dbContext)) {
var ex = _dbContext.Exhibits.Find(tsk.ExhibitId);
var ca = _dbContext.Cases.Find(ex.ParentCaseId);
output.Add(new TaskingViewModel
{
Tasking = tsk,
ExhibitId = ex.Id,
ExhibitName = ex.GetExhibitName(),
CaseId = ca.Id,
CasePriority = ca.GetCasePosition(_dbContext.TopTens.ToSortedList(_dbContext)),
});
}
}
var result = Search(searchString, output);
return View(result.ToPagedList(pageNumber, pageSize: ps));
}
搜索函数返回一个新List
的TaskingViewModel
匹配 caseIds 与searchString
using 包含。
public List<TaskingViewModel> Search(string searchString, List<TaskingViewModel> toSearch)
{
var result = new List<TaskingViewModel>();
if (String.IsNullOrEmpty(searchString))
return toSearch;
foreach(var item in toSearch) {
if (item.Id.Contains(searchString))
result.Add(item);
}
return result;
}