我正在尝试实现一个搜索功能,搜索结果可以填充到GridView中。我在C#中使用LINQ查询我的数据库。
问题是,如果用户想要通过多个列/字段进行搜索,并且有多个搜索项,那么我该怎么办?例如,如果我搜索包含以下三个字段的表,并且有一些数据: > firstName | lastname | players# >>1. Michael | Jordan | 12 >>2. Michael | Jordan | 24 >>3. Michael | Jordan | 45 >>4. DeAndre| Jordan | 6 >>5. Jerome| Jordan | 44 >>6. Jordan| Sparks| 88
现在,如果我搜索Jordan,则会得到所有内容:
如果我搜索Michael Jordan,则应该返回行#1,2,3。
如果我搜索Jordan Sparks 88,则应该返回行#6。
因此,我的问题是我不知道搜索词可能出现在哪个列/字段中,所以必须搜索所有列/字段。在我的当前代码中,我遍历每个列/字段名并使用Contains()然后||(“or”),但它仅适用于一个搜索项。
是否有一种优雅而简单的方法来搜索和过滤整个LINQ表,以使列表最小化?从那里,我将将该结果添加到数据源,然后绑定它。
我正在使用一个典型的GridView。它看起来像这样:
问题是,如果用户想要通过多个列/字段进行搜索,并且有多个搜索项,那么我该怎么办?例如,如果我搜索包含以下三个字段的表,并且有一些数据: > firstName | lastname | players# >>1. Michael | Jordan | 12 >>2. Michael | Jordan | 24 >>3. Michael | Jordan | 45 >>4. DeAndre| Jordan | 6 >>5. Jerome| Jordan | 44 >>6. Jordan| Sparks| 88
现在,如果我搜索Jordan,则会得到所有内容:
如果我搜索Michael Jordan,则应该返回行#1,2,3。
如果我搜索Jordan Sparks 88,则应该返回行#6。
因此,我的问题是我不知道搜索词可能出现在哪个列/字段中,所以必须搜索所有列/字段。在我的当前代码中,我遍历每个列/字段名并使用Contains()然后||(“or”),但它仅适用于一个搜索项。
是否有一种优雅而简单的方法来搜索和过滤整个LINQ表,以使列表最小化?从那里,我将将该结果添加到数据源,然后绑定它。
我正在使用一个典型的GridView。它看起来像这样:
<asp:GridView ID="GridView" runat="server" AllowSorting="True" PagerStyle-Mode="NumericPages"
AutoGenerateColumns="false" Width="100%" CssClass="gridView" OnPageIndexChanging="GridView_PageIndexChanging"
AllowPaging="True" DataKeyNames="idPlayersList" OnRowCommand="GridView_RowCommand"
OnRowEditing="GridView_RowEditing" OnRowCancelingEdit="GridView_CancelEditRow"
OnRowUpdating="GridView_UpdateRow" OnRowDataBound="GridView_RowDataBound">
<RowStyle CssClass="rowStyle"></RowStyle>
<asp:BoundField DataField="FirstName" HeaderText="First Name" SortExpression="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="Last Name" SortExpression="LastName" />
<asp:BoundField DataField="PlayersNumber" HeaderText="Players Number" SortExpression="PlayersNumber" />
<asp:TemplateField HeaderText="Team" SortExpression="Team">
<EditItemTemplate>
<asp:DropDownList ID="ddlTeam" runat="server" CssClass="dropdown" AutoPostBack="True"
AppendDataBoundItems="true" DataTextField="TeamName" DataValueField="idTeam">
</asp:DropDownList>
</EditItemTemplate>
<ItemTemplate>
<asp:Label ID="lblTeam" runat="server" Text='<%# Bind("TeamName") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
我的当前搜索功能大致如下:
/**
* This method is for button search functionality
*
*/
protected void btnSearch_Click(object sender, EventArgs e)
{
// Call to Entity Model Framework
DBModel.DBEntities context = new DBModel.DBEntities();
string[] searchTerms = txtSearch.Text.Trim().Split('&');
//Prepare to build a "players" query:
IQueryable<DBModel.playersList> playersListQuery = context.playersLists;
foreach (var term in searchTerms)
{
//Refine our query, one search term at a time:
playersListQuery = playersListQuery.Where(p => p.isDeleted == false && (p.FirstName.Contains(term.Trim()) ||
p.LastName.Contains(term.Trim()) ||
p.PlayersNumber.Contains(term.Trim()) ||
p.Team.Name.Contains(term.Trim())));
}
//Now we have the complete query. Get the results from the database:
var filteredplayersList = playersListQuery.Select(s => new
{
idPlayersList = s.idPlayersList,
FirstName = s.FirstName,
LastName = s.LastName,
PlayersNumber = s.PlayersNumber,
TeamName = s.Team.Name
}).ToList();
GridView.DataSource = filteredplayersList; //Connecting query to the datasource Gridview
GridView.DataBind(); //Binding Gridview
}