- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试实现一个搜索功能,可以将结果填充到 Gridview。我正在使用 LINQ 在 C# 中查询我的数据库。
我想弄清楚的问题是,如果用户想要使用多个搜索词搜索多个列/字段,那么我该怎么做呢?例如,如果我用这 3 个字段搜索一个表,并且我有一些数据,例如:> 名字 |姓 |球员#>>1.迈克尔 |乔丹 | 12>>2。迈克尔 |乔丹 | 24>>3。迈克尔 |乔丹 | 45>>4。德安德鲁|乔丹 | 6个>>5。杰罗姆|乔丹 | 44>>6。约旦| Spark | 88
现在,如果我搜索 Jordan,我会得到所有内容:
如果我搜索 Michael Jordan,那么我应该返回第 1、2、3 行。
如果我搜索 Jordan Sparks 88,我应该返回第 6 行。
所以我的问题是我不知道搜索词在表中的什么位置,所以我必须搜索所有列/字段。在我当前的代码中,我有一些东西可以遍历每个列/字段名称并使用 Contains() 然后 || (“或”),但它仅适用于 1 个搜索词。
是否有一种优雅而简单的方法来搜索和过滤整个 linq 表,以便将列表最小化?我将从那里将该结果添加到数据源,然后绑定(bind)它。
@Sphinxxx 我使用的是典型的 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
}
最佳答案
幸运的是,在 Linq2SQL 中创建多个 AND(每个搜索词一个)很容易 - 只需继续添加 .Where(..
到您的查询:
string[] searchTerms = "Jordan Sparks 88".Split(' ');
using (var dc = new MyDataContext())
{
//Using DataContext.Log is handy
//if we want to look at Linq2SQL's generated SQL:
dc.Log = new System.IO.StringWriter();
//Prepare to build a "players" query:
IQueryable<Player> playersQuery = dc.Players;
//Refine our query, one search term at a time:
foreach (var term in searchTerms)
{
//Create (and use) a local variable of the search term
//to avoid the "outer variable trap":
//http://stackoverflow.com/questions/3416758
//http://stackoverflow.com/questions/295593
var currentTerm = term.Trim();
playersQuery = playersQuery.Where(p => (p.isDeleted == false)
&&
(p.FirstName.Contains(currentTerm) ||
p.LastName.Contains(currentTerm) ||
p.PlayersNumber.Contains(currentTerm) ||
p.Team.Name.Contains(currentTerm))
);
}
//Now we have the complete query. Get the results from the database:
var filteredPlayers = playersQuery.Select(p => new
{
p.idPlayer,
p.FirstName,
p.LastName,
p.PlayersNumber,
TeamName = p.Team.Name
})
.ToArray();
//See if the generated SQL looked like it was supposed to:
var sql = dc.Log.ToString();
}
关于c# - 使用 LINQ 进行全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17414907/
给出数据库表中的以下信息: Col 1, Col2, Col3 1 , x , G 1 , y , H 2 , z , J 2 , a , K 2 , a
linq 的一般缺点是什么。 最佳答案 刚开始使用时可能很难理解 延迟执行可以将错误与其原因(在时间方面)分开 进程外 LINQ(例如 LINQ to SQL)总是有点漏洞百出的抽象——你需要知道什么
当我使用 LINQ Where 子句时,返回的项目列表是否遵循它们在原始列表中的顺序? 最佳答案 这取决于被查询的集合如何拥有它的 GetEnumerator被执行。如 GetEnumerator按照
在 Linq 中进行连接时,例如 from c in customers join x in somelistofcustomers on x.Id equals c.Id 你会得到错误 x is n
我正在使用 LINQ 来查询数据。考虑用户只想报告 3 个字段中的 1 个的情况? (见下文) 谁能告诉我如何动态构建查询? 谢谢 DD var query = from cl in db.t
假设我们有下表: Person: PersonID, Name, Age, Gender 并且我们提供了一个搜索功能,允许用户根据名称 来搜索表。和/或 年龄。 编写 SQL(或 LI
这应该很容易。 我要检查两个列表是否相同,因为它们包含所有相同的元素,顺序不重要。 重复的元素被认为是相等的,即new[]{1,2,2}与new[]{2,1}相同 最佳答案 var same = li
假设我有一个数组,我想对varchar进行LINQ查询,该查询返回在varchar中任何位置具有数组元素的任何记录。 这样的事情会很甜蜜。 string[] industries = { "airli
我正在努力寻找 LINQ orderby 示例,其中数据按列索引排序。这是可能的吗? 谢谢 最佳答案 LINQ 中没有列这样的概念,只有字段和属性。您的意思可能是在您创建的匿名类型中指定属性的索引:
我有一个类项目。 class Item{ public int Id { get; set; } public DateTime CreatedDate { get;
我有一张 table 叫做产品。我想获取 productID 为 2 OR 6 OR 9 的所有产品 SQL 是:Select * from products where productID=2 OR
使用时 Contains对于 Linq-to-objects 上的动态 Linq,搜索区分大小写。我希望能够搜索不区分大小写的(如 Linq-to-sql,因为 SQL 服务器默认执行此操作)。 就像
有人能告诉我如何将此查询转换为 linq 吗? SELECT dpr_ts ,dpr_close ,nvl((SELECT pay.pay_dividend
我正在使用linq to实体(EF)。 我有一个采用4个字符串参数的构造函数。根据什么参数不为null,我必须构建linq查询。我可以使用if else语句,但是在这种情况下,我还有其他带有10个参数
下面是我的代码的简化版本。我希望 p1和 p2是平等的,还有p1_after和 p2_after是相等的,因为 GetPerson1() 之间的唯一区别是和 GetPerson2()是 .ToList
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 7年前关闭。 Improve t
我看到一些代码是 linq 用于遍历 c# 中的字典对象。我认为 linq 只是用于 linq 到 sql 的数据库。提到的代码中使用的 linq 是一个选择类型的语句,只是没有数据库。 有没有 li
我刚刚开始在一个中型项目中使用LINQ to SQL,并且想加深我对L2S提供的优势的理解。 我看到的一个缺点是它增加了另一层代码,我的理解是,它的性能比使用存储过程和ADO.Net慢。似乎调试也可能
可绑定(bind) LINQ 和连续 LINQ 之间的主要区别是什么? •可绑定(bind)LINQ:www.codeplex.com/bindablelinq • 连续 LINQ:www.codep
Linq 中没有内置全文搜索,而且似乎没有很多关于该主题的帖子,所以我玩了一下,并为我的实用类想出了这个方法: public static IEnumerable GenericFullTextSea
我是一名优秀的程序员,十分优秀!