如何在C#中的搜索表单中实现LIKE操作?
我使用下面的代码作为我的搜索逻辑,基本上,当在相应的文本框或下拉列表中有输入时,它会计算字段,我的问题是代码只用于精确匹配,实现.Contains()搜索或实现类似SQL搜索的搜索的最佳方法是什么如何在C#中的搜索表单中实现LIKE操作?,c#,linq,C#,Linq,我使用下面的代码作为我的搜索逻辑,基本上,当在相应的文本框或下拉列表中有输入时,它会计算字段,我的问题是代码只用于精确匹配,实现.Contains()搜索或实现类似SQL搜索的搜索的最佳方法是什么 private void btnSearch_Click(object sender, EventArgs e) { bool ok_username = !txtUsername.IsBlank(); bool ok_firstname
private void btnSearch_Click(object sender, EventArgs e)
{
bool ok_username = !txtUsername.IsBlank();
bool ok_firstname = !txtFirstname.IsBlank();
bool ok_lastname = !txtLastName.IsBlank();
bool ok_userlevels = cboUserLevels.IsItemInList();
_query = from _v
in Classes.Data.getdb().vUsers
where
_v.username ==(ok_username ? txtUsername.Text : _v.username) &&
_v.firstname == (ok_firstname ? txtFirstname.Text : _v.firstname) &&
_v.lastname == (ok_lastname ? txtLastName.Text : _v.lastname) &&
_v.userlevel == (ok_userlevels ? cboUserLevels.Text : _v.userlevel)
select _v;
gv.DataSource = _query ;
}
当我尝试将eval表达式包含在.Contains()函数中时,它表示只有可以在客户端上计算的表达式才能用作.Contains函数中的参数。谢谢谢谢你的建议
嗯 感谢Alex让我了解了SQLMethods函数。但现在我还是同意桑德关于链接表达式树的建议。如果有人能把这段代码缩短,我会非常感激,因为在这个解决方案中,我有两组查询,一组是灵活的,另一组是精确的搜索。再次感谢亚历克斯和桑德
private void btnSearch_Click(object sender, EventArgs e)
{
bool ok_username = !txtUsername.IsBlank();
bool ok_firstname = !txtFirstname.IsBlank();
bool ok_lastname = !txtLastName.IsBlank();
bool ok_userlevels = cboUserLevels.IsItemInList();
if (optMode.CheckedIndex == 0) //flexible search, the else part is the exact search
{
_query = (from _v
in Classes.Data.getdb().vUsers
where
_v.userlevel == (ok_userlevels ? cboUserLevels.Text : _v.userlevel)
select _v);
if (ok_username)
_query = _query.Where(x => x.username.Contains(txtUsername.Text));
if (ok_firstname)
_query = _query.Where(x => x.firstname.Contains(txtFirstname.Text));
if (ok_lastname)
_query = _query.Where(x => x.lastname.Contains(txtLastName.Text));
}
else
{
_query = (from _v
in Classes.Data.getdb().vUsers
where
_v.username == (ok_username ? txtUsername.Text : _v.username) &&
_v.firstname == (ok_firstname ? txtFirstname.Text : _v.firstname) &&
_v.lastname == (ok_lastname ? txtLastName.Text : _v.lastname) &&
_v.userlevel == (ok_userlevels ? cboUserLevels.Text : _v.userlevel)
select _v);
}
gv.DataSource = _query.ToList();
}
您可以一步一步地使查询更具体,如下所示:
var _query = from _v in Classes.Data.getdb().vUsers
select v;
if(!txtUsername.IsBlank())
_query = _query.Where(x => x.username.Contains(txtUsername.Text));
if(!txtFirstName.IsBlank())
_query = _query.Where(x => x.firstname.Contains(txtFirstName.Text));
// etc.
gv.DataSource = _query;
您必须从数据库中的
字符串调用Contains
:
_query =
from _v in Classes.Data.getdb().vUsers
where
(txtUsername.IsBlank() || _v.username.Contains(txtUsername.Text)) &&
(txtFirstname.IsBlank() || _v.firstname.Contains(txtFirstname.Text)) &&
(txtLastName.IsBlank() || _v.lastname.Contains(txtLastName.Text)) &&
(!cboUserLevels.IsItemInList() || _v.userlevel.Contains(cboUserLevels.Text))
select _v;
如果要使用类似SQL的运算符,可以使用System.Linq.Data.SqlClient.SqlMethods
:
_query =
from _v in Classes.Data.getdb().vUsers
where
SqlMethods.Like(_v.username, "%" + txtUsername.Text + "%") &&
SqlMethods.Like(_v.firstname, "%" + txtFirstname.Text + "%") &&
SqlMethods.Like(_v.lastname, "%" + txtLastName.Text + "%") &&
SqlMethods.Like(_v.userlevel, "%" + cboUserLevels.Text + "%")
select _v;
+1这是查询表达式的另一个优点。只需要在此处添加Contains()调用。-1这既不建议如何使用Contains
,也不建议如何使用类似SQL的运算符。您好,Sander,感谢您的回答,您的回答提醒我,我们确实可以链接查询表达式。将根据您和Alex的答案制定解决方案。@Alex:更新了答案,在键入代码时出错你好Alex,谢谢SQLMethods提示,我不知道。一个问题是,这种连接形式在被转换时是否可以避免sql注入?我知道linq在sql注入中是安全的,但在使用该表单时又如何呢?谢谢你的帮助!切换VB.NET并使用;)