Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的搜索表单中实现LIKE操作?_C#_Linq - Fatal编程技术网

如何在C#中的搜索表单中实现LIKE操作?

如何在C#中的搜索表单中实现LIKE操作?,c#,linq,C#,Linq,我使用下面的代码作为我的搜索逻辑,基本上,当在相应的文本框或下拉列表中有输入时,它会计算字段,我的问题是代码只用于精确匹配,实现.Contains()搜索或实现类似SQL搜索的搜索的最佳方法是什么 private void btnSearch_Click(object sender, EventArgs e) { bool ok_username = !txtUsername.IsBlank(); bool ok_firstname

我使用下面的代码作为我的搜索逻辑,基本上,当在相应的文本框或下拉列表中有输入时,它会计算字段,我的问题是代码只用于精确匹配,实现.Contains()搜索或实现类似SQL搜索的搜索的最佳方法是什么

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并使用;)