我有一个MVC站点,该站点连接到具有多个表的数据库。有些表只有1000条左右的记录,因此搜索这些表非常简单。但是,其中一个表有超过200万条记录,我尝试实现相同的搜索方法,但速度太慢。对于记录较少的表,搜索将遍历每一列以查找匹配项,但是具有一百万条记录的表只能以一种有效的方式搜索一列。本质上,我要解决此问题的方法是允许用户搜索搜索结果。因此,如果我要在具有100万条记录的表中按Apple进行搜索,则可以说保留了100,000条记录。然后,我可以通过Gala在剩余的100,000条记录中进行搜索,以进一步缩小搜索范围。这可能吗?还是有更好的方法来搜索我没有想到的许多记录?
控制器
public ViewResult Index(string sortOrder, string currentFilter, string search, int? page, int? pageSize)
{
int pageIndex = 1;
pageIndex = page.HasValue? Convert.ToInt32(page) : 1;
int defaSize = (pageSize ?? 25);
ViewBag.psize = defaSize;
ViewBag.PageSize = new List<SelectListItem>()
{
new SelectListItem() { Value = "25",Text = "25"},
new SelectListItem() { Value = "50",Text = "50"},
new SelectListItem() { Value = "100",Text = "100"},
new SelectListItem() { Value = "1000",Text = "1000"},
};
ViewData["ControllerName"] = this.ToString();
ViewBag.CurrentSort = sortOrder;
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "pkDeviceUnderTest" : "";
if (search == null)
{
ViewBag.TotalCount = dbModel.DeviceUnderTests.Count();
}
else
{
var ld = dbModel.DeviceUnderTests.Where(x => x.nkDeviceUnderTest.Contains(search)||x.nkNotes.Contains(search)||x.FaultApplication.nkFaultApplication.Contains(search)||x.Firmware.nkFirmware.Contains(search)
||x.Hardware.nkHardware.Contains(search)||x.Location.nkLocation.Contains(search)||x.Power.nkPower.Contains(search)||x.nkHandleRating.ToString().Contains(search)||x.nkPreEventTime.ToString().Contains(search)).ToList()
.Count();
ViewBag.TotalCount = ld;
}
ViewBag.cf = currentFilter;
ViewBag.search = search;
Session["searchcircuit"] = search;
ViewBag.defaSize = defaSize;
var div = ViewBag.TotalCount / defaSize;
ViewBag.numofPages = ((ViewBag.defaSize - 1) + ViewBag.TotalCount) / ViewBag.defaSize;
ViewBag.index = pageIndex;
int pagenum = pageIndex;
var records = dbModel.DeviceUnderTests.Where(x => x.nkDeviceUnderTest.Contains(search) || x.nkNotes.Contains(search) || x.FaultApplication.nkFaultApplication.Contains(search) || x.Firmware.nkFirmware.Contains(search)
|| x.Hardware.nkHardware.Contains(search) || x.Location.nkLocation.Contains(search) || x.Power.nkPower.Contains(search) || x.nkHandleRating.ToString().Contains(search) ||search==null|| x.nkPreEventTime.ToString().Contains(search)).OrderBy(x => x.pkDeviceUnderTest).Skip(defaSize * (pagenum - 1)).Take(defaSize);
var result = new StaticPagedList<DeviceUnderTest>(records, pageIndex, defaSize, ViewBag.TotalCount);
return View(result);
}
查看
@using (Html.BeginForm("Index", "Circuit", FormMethod.Get))
{
<input type="text" name="search" placeholder="Search ... " />
<input type="submit" name="submit" value="Search" class="btn btn-default" style="background-color:#337ab7;color:azure" />
}