【问题标题】:How to search for same search string in multiple columns?如何在多列中搜索相同的搜索字符串?
【发布时间】:2011-05-03 18:30:12
【问题描述】:

我正在搜索 EF 数据模型中文本框控件的字符串输入。有人可以帮我在代码文件中构造 where 子句来做到这一点。 我在代码中尝试了下面的一段代码,即使它在我输入搜索字符串并提交搜索时编译会抛出错误。

Where("it.[CaseName] like '%'" + searchString +
    "'%' or it.[CaseNumber] like '%'" + searchString +
    "'%' or it.[AppRegNumber] like '%'" + searchString +
    "'%' or it.[SSNo] like '%'" + searchString + "'%'")

当在 EntityDataSource 控件标记中使用相同的 where 子句时,它会正确接受和搜索。 我正在更改我的页面以使用 ObjectDataSource 控件连接到业务逻辑层类,而不是直接连接到 EDM 数据模型。

【问题讨论】:

  • 将 where 子句更改为 Where("it.[CaseName] like '%" + searchString + "%'" + "or it.[CaseNumber] like '%" + searchString + "%'或它。[AppRegNumber] 像 '%" + searchString + "%'")。这有效
  • 顺便说一句:你知道 SQL 注入吗?将用户在网页文本框中输入的字符串直接放入 SQL 子句中可能非常危险。这就是存在ObjectParameter 重载的原因,并且是强烈推荐的构造查询的方法(请参阅下面的答案)。您可以在此处观看 SQL 注入可能发生的危险事情:pluralsight-training.net/microsoft/players/… 意外地,该演示非常适合您的查询。
  • @Slauma,感谢您提醒这个漏洞。它只是让我忘记了。

标签: asp.net entity-framework c#-4.0


【解决方案1】:

如果您想使用ObjectQueryWhere Query Builder 方法(我认为这就是您在问题中使用的方法),则需要从查询表达式中删除内部单引号:

Where("it.[CaseName] like '%" + searchString +
    "%' or it.[CaseNumber] like '%" + searchString +
    "%' or it.[AppRegNumber] like '%" + searchString +
    "%' or it.[SSNo] like '%" + searchString + "%'")

或作为参数化查询:

Where("it.[CaseName] like @search" +
    " or it.[CaseNumber] like @search" +
    " or it.[AppRegNumber] like @search" +
    " or it.[SSNo] like @search",
    new ObjectParameter("search", string.Concat("%", searchString, "%")))

编辑

如果searchString 来自网页上的用户输入,则不要使用第一个版本,因为此版本容易受到SQL 注入 的影响(在搜索引擎中输入此术语以进行解释)。而是在第二个版本中使用参数化查询。

【讨论】:

    【解决方案2】:

    嗯,你可以使用 Linq 扩展方法:

    .Where(r => r.CaseName.IndexOf(searchString) >= 0
        || r.CaseNumber.IndexOf(searchString) >= 0
        || r.AppRegNumber.IndexOf(searchString) >= 0
        || r.SSNo.IndexOf(searchString) >= 0)
    

    【讨论】:

    • 输入字符串“sa”进行搜索,得到错误“sa”不是“SCDSS_ApplicationDataModel.Applicant”类型的成员
    • 听起来你正在将我写的内容变成一个字符串,而不是使用 System.Linq 并使用我写的方法。您可能想了解一下 Linq 扩展方法:msdn.microsoft.com/en-us/library/bb896238.aspx
    • 我修改了我的代码以包含您编写的内容,但没有将其转换为字符串。在搜索页面输入sa即可运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2021-11-19
    • 2022-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多