【问题标题】:EF Select all or matching stringEF 选择所有或匹配的字符串
【发布时间】:2014-02-19 08:19:48
【问题描述】:

如果我使用普通 SQL,这就是我想要做的事情

  1. 用户选择“全部”

    SELECT COLUMN FROM TABLE WHERE NAME LIKE '%'
    
  2. 用户选择的特定名称

    SELECT COLUMN FROM TABLE WHERE NAME LIKE 'John'
    

在 EF 中,类似查询的最接近的翻译似乎是 contains。所以我做了这样的事情:

string comboboxValue = getComboboxValue(); //Empty if all selected

from tb in _dbContext.TABLE
where tb.NAME.Contains(comboboxValue)
select COLUMN

这适用于检索所有内容。但是,使用 Contains 将意味着上述内容将匹配“Johnathan”,而不仅仅是“John”

有没有办法获得完全相同的行为?

【问题讨论】:

  • LIKE '%pattern%' 将匹配 pattern1patternLIKE 'pattern' 将仅匹配 pattern% - 是LIKE 子句中的通配符。如果选择全部,则根本不需要WHERE!如果选择不带通配符,则不需要LIKE,使用=
  • @Alexander 没错。在您的示例中,我只想匹配“模式”或如果指定,则匹配“%”。特别是,我不想要 '%pattern%',但是使用 contains 方法,这似乎是无法避免的。

标签: c# sql .net entity-framework


【解决方案1】:

like 查询使用% 作为通配符。因此,虽然您永远不想搜索 WHERE NAME LIKE '%'(因为这只会返回所有内容),但您可以使用 % 搜索模式:

  1. Where Name like 'John%' 匹配名称​​以“John”开头的所有行
  2. Where Name like '%john' 匹配 Name 'John' 结尾的所有行
  3. Where Name like '%john%' 匹配列内某处 Name 为“john”的所有行

使用实体框架,您可以匹配这些不同的搜索类型:

  1. 返回名称以“John”开头的位置:.Where(x => x.Name.StartsWith("John"));
  2. 返回名称以“John”结尾的位置:.Where(x => x.Name.EndsWith("John"));
  3. 返回 Name 内部任何位置包含“John”的位置:.Where(x => x.Name.Contains("John"));
  4. 返回 Name 等于“John”的位置:.Where(x => x.Name == "John");
  5. 不要过滤名称:(只是不要为此使用 where 子句)

在您的原始 sql 中,当您不使用通配符时,您也希望避免使用 Like。如果要匹配精确值,请使用=。如果您不想过滤,则不要包含where 子句。

对于您的具体情况,您可能想查看组合框的值是什么,然后进行相应操作:

string comboboxValue = getComboboxValue(); //Empty if all selected
var isAll = string.IsNullOrEmpty(comboboxValue)
return _dbContext.Table.Where(x => isAll || x.Name == comboBoxValue).Select(x => x.COLUMN);

您似乎不需要使用 Contains 或您提到的任何其他通配符搜索。

【讨论】:

  • 这似乎不是 OP 所要求的
  • 不,我想检索所有内容或只检索与搜索词匹配的行
  • @l46kok 刚刚修复了逻辑。如果comboboxValue 为空,则isAll 为真并且所有行都返回。如果comboboxValue 不为空或不为null,则它只会返回与搜索词匹配的行。
【解决方案2】:

您可以使用一些信号变量来选择一种方式或另一种方式,例如

bool matchExact = false;
...
where tb.NAME == ( matchExact ? comboboxValue : tb.NAME )
...

尽管头脑空虚

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-14
    • 2015-02-21
    • 1970-01-01
    • 2021-04-11
    相关资源
    最近更新 更多