【问题标题】:Use SQL LIKE operator in C# LINQ在 C# LINQ 中使用 SQL LIKE 运算符
【发布时间】:2017-01-20 06:56:33
【问题描述】:

我正在用 C# 构建一个查询。对于整数和字符串字段,大小写非常简单。对于日期字段,我使用以下查询:

list.Where("myDateColumn >= DateTime(2017,1,20)");

如何在 LINQ 中执行以下 SQL LIKE 查询?

select * from table where myTextColumn LIKE '%abc%';

【问题讨论】:

  • 使用 .Contains
  • @monstertjie_za:我想在同一日期过滤器中添加类似过滤器。
  • 您想对日期执行 LIKE 吗?为什么不只选择日期等于某个日期的位置,而忽略时间部分?
  • 示例人员:list.Where("myDateColumn >= DateTime(2017,1,20) AND myTextColumn LIKE '%abc%' ");
  • list.Where(x => x.myDateColumn >= date && x.myTextColumn.Contains('abc'));

标签: c# sql linq


【解决方案1】:

Like 在 Linq 中有很多可能性:

对于 LIKE '%abc%';

list.Where(x => x.myTextColumn.Contains('abc'));

对于 LIKE 'abc%';

list.Where(x => x.myTextColumn.StartWith('abc'));

对于 LIKE '%abc';

list.Where(x => x.myTextColumn.EndsWith('abc'));

更新:如果您还需要添加日期比较意味着您可以执行以下操作:

DateTime date2Compare = new DateTime(2017, 1, 20);
list.Where(x => myDateColumn >= date2Compare && x.myTextColumn.Contains('abc'));

【讨论】:

  • 我想在同一日期过滤器中添加类似过滤器。
  • @BehzadQureshi:您希望Like 对日期字段做什么?数据库中该列的数据类型是什么?你的实际需求是什么?
  • 请阅读有问题的 cmets。您将了解实际问题
  • @BehzadQureshi:请参阅我的回答中的更新:如果我误解了您指定的场景,请原谅我
  • 缺失:所以我无法在字符串中指定类似查询?
【解决方案2】:

在 LIKE 子句中放置通配符 '%' 会产生影响,而 C# 具有支持这一点的方法。以下是通配符的位置含义。

喜欢'%abc'

含义:查找任何以“abc”结尾的单词。

C# 等效项EndsWith

喜欢'abc%'

意思:随便找一个以'abc'开头的单词,后面的文字就不用管了。

C# 等效项StartWith

喜欢'%abc%'

含义:查找任何包含“abc”的单词,而您并不关心它出现在单词的哪个位置。

C# 等效项Contains

【讨论】:

    【解决方案3】:

    您可以将ContainsmyTextColumn 字段一起使用

    var date = new DateTime(2017,1,20);
    list.Where(x => x.myDateColumn >= date  && x.myTextColumn.Contains('abc'));
    

    【讨论】:

      【解决方案4】:

      让我们尝试解决一般情况中的问题。假设我们得到了类似的东西

      select ...
       where ... MyField like '%abc%'
      

      我们可以尝试将like表达式转换成对应的regular一个:

      Like | Description                       |Regular
      -------------------------------------------------
         _ | any character  (one and only one) | .
         % | any characters (zero or more)     | .*
      

      实施

      // If you want to implement both "*" and "?"
      private static String LikeToRegular(String value) {
        return "^" + Regex.Escape(value).Replace("_", ".").Replace("%", ".*") + "$"; 
      }
      

      用法:

      var result list
        .Where(x => Regex.IsMatch(x.myTextColumn, LikeToRegular("%abc%")));
      

      您可能希望在匹配之前将数据转换为string

       var result list
        .Where(x => Regex.IsMatch(x.myDate.ToString(), LikeToRegular("%abc%")));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多