【发布时间】:2014-07-10 22:13:03
【问题描述】:
我试图只显示搜索结果而不是整个数据库。
这是我的控制器:
public async Task<ActionResult> Index(string searchString)
{
var asset = from s in db.AssetInventoryTables
select s;
if (!String.IsNullOrEmpty(searchString))
{
asset = asset.Where(s => s.AssetTag.Contains(searchString) ||
s.ECCNNum.Contains(searchString) ||
s.GTag.Contains(searchString) ||
s.ItarNum.Contains(searchString) ||
s.ViperTag.Contains(searchString) ||
s.PartNum.Contains(searchString) ||
s.SerialNum.Contains(searchString) ||
s.SerialNum2.Contains(searchString) ||
s.SerialNum3.Contains(searchString) ||
s.SerialNum4.Contains(searchString) ||
s.SerialNum5.Contains(searchString) ||
s.SchedBCode.Contains(searchString) ||
s.Notes.Contains(searchString) ||
s.Name.Contains(searchString) ||
s.LocationTable.LocNAME.Contains(searchString) ||
s.ITARTable.ItarTYPE.Contains(searchString) ||
s.ProgramTable.ProgNAME.Contains(searchString) ||
s.StatusTable.StatTYPE.Contains(searchString) ||
s.SystemTable.SysNAME.Contains(searchString)
);
}
var assetinventorytables = db.AssetInventoryTables.Include(a => a.ITARTable).Include(a => a.LocationTable).Include(a => a.LocationTable1).Include(a => a.MoveTable).Include(a => a.ProgramTable).Include(a => a.RMATable).Include(a => a.ShipProviderTable).Include(a => a.ShipStatusTable).Include(a => a.SiteLocationTable).Include(a => a.StatusTable).Include(a => a.SystemTable).Include(a => a.TransferTable);
//return View(await assetinventorytables.ToListAsync());
return View(asset);
}
我正在尝试搜索多个字段。 这是我的 index.cshtml
<h2>Index</h2>
<p>
@Html.ActionLink("Create New", "Create")
</p>
@using (Html.BeginForm("Index", "Movement2", FormMethod.Get))
{
<p>
Search: @Html.TextBox("searchString")
<input type="submit" value="Search" />
</p>
if ("searchString" != null)
{
<table class="table">
<tr>
<th>
@Html.DisplayNameFor(model => model.Name)
</th>
<th>
@Html.DisplayNameFor(model => model.ViperTag)
</th>
<th>
@Html.DisplayNameFor(model => model.PartNum)
</th>
<th>
@Html.DisplayNameFor(model => model.SerialNum)
</th>
<th>
@Html.DisplayNameFor(model => model.Notes)
</th>
<th>
@Html.DisplayNameFor(model => model.LocationTable.LocNAME)
</th>
<th>
@Html.DisplayNameFor(model => model.ProgramTable.ProgNAME)
</th>
<th>
@Html.DisplayNameFor(model => model.StatusTable.StatTYPE)
</th>
<th>
@Html.DisplayNameFor(model => model.SystemTable.SysNAME)
</th>
<th></th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>
@Html.DisplayFor(modelItem => item.Name)
</td>
<td>
@Html.DisplayFor(modelItem => item.ViperTag)
</td>
<td>
@Html.DisplayFor(modelItem => item.PartNum)
</td>
<td>
@Html.DisplayFor(modelItem => item.SerialNum)
</td>
<td>
@Html.DisplayFor(modelItem => item.Notes)
</td>
<td>
@Html.DisplayFor(modelItem => item.LocationTable.LocNAME)
</td>
<td>
@Html.DisplayFor(modelItem => item.ProgramTable.ProgNAME)
</td>
<td>
@Html.DisplayFor(modelItem => item.StatusTable.StatTYPE)
</td>
<td>
@Html.DisplayFor(modelItem => item.SystemTable.SysNAME)
</td>
<td>
@Html.ActionLink("Edit", "Edit", new { id = item.AssetID }) |
@Html.ActionLink("Details", "Details", new { id = item.AssetID }) |
@Html.ActionLink("Delete", "Delete", new { id = item.AssetID })
</td>
</tr>
}
</table>
}
}
这是我试图阻止页面在加载时显示所有记录的地方。我只想看到搜索框,一旦搜索框有一个值并提交,那么它将只显示搜索结果。这就是为什么我使用 IF 语句,但它仍然显示页面加载时的所有记录。我被难住了。
【问题讨论】:
-
首先是什么 //if ("searchString" != null)
-
您的数据库前面的任何层肯定理解
offest和limit参数(或实现等效构造)? -
searchString 是用户在搜索框中键入的字符串。在执行搜索之前,我不希望页面显示任何记录,因此如果 searchString 值为空,则不再执行任何代码。
-
这可能是我见过的最糟糕的
Where()子句。当您在所有内容上执行Contains时,它永远不会达到索引。这适用于小型数据集,但是当它开始变得更大时,您会发现这将完全成为瓶颈并锁定您的系统。
标签: asp.net-mvc database search-engine