EF选择全部或匹配的字符串

时间:2014-02-19 08:19:48

标签: c# sql .net entity-framework

如果我使用普通的SQL

,这就是我要做的
  1. 用户选择“全部”

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

    SELECT COLUMN FROM TABLE WHERE NAME LIKE 'John'
    
  3. 在EF中,类似查询的最接近的翻译似乎是包含的。所以我做了这样的事情:

    string comboboxValue = getComboboxValue(); //Empty if all selected
    
    from tb in _dbContext.TABLE
    where tb.NAME.Contains(comboboxValue)
    select COLUMN
    

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

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

2 个答案:

答案 0 :(得分:2)

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

  1. Where Name like 'John%'匹配名称​​的所有行'John'
  2. Where Name like '%john'匹配Name 'John'
  3. 结尾的所有行
  4. Where Name like '%john%'匹配名称在列
  5. 内某处有'john'的所有行

    使用Entity Framework,您可以匹配以下不同的搜索类型:

    1. 返回名称以“John”开头的地方:.Where(x => x.Name.StartsWith("John"));
    2. 返回姓名以'John'结尾的地方:.Where(x => x.Name.EndsWith("John"));
    3. 返回姓名内有“John”的地方:.Where(x => x.Name.Contains("John"));
    4. 返回姓名等于'John'的地方:.Where(x => x.Name == "John");
    5. 不要过滤名称:(只是不要使用where子句)
    6. 在原始的sql中,当您不使用通配符时,您可能希望避免使用Like。如果要匹配精确值,请使用=。如果您不想过滤,那么就不要包含where子句。

      根据您的具体情况,您可能希望查看comboBox的值,并相应地继续:

      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或您引用的任何其他通配符搜索。

答案 1 :(得分:0)

您可以使用某些信号变量来选择

之类的方式 bool matchExact = false;
...
where tb.NAME == ( matchExact ? comboboxValue : tb.NAME )
...

心灵无效但