在C#LINQ中使用SQL LIKE运算符

时间:2017-01-20 06:56:33

标签: c# sql linq

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

import PlaygroundSupport
import Foundation

let cal = NSCalendar.current

var comps = cal.dateComponents([.era, .year, .month, .day, .hour, .minute], from: Date())
comps.minute = comps.minute! + 1

let nextMinute = cal.date(from: comps)

let timer = Timer(fire: nextMinute!, interval: 60, repeats: true) { _ in
    print("Minute change")
}

RunLoop.current.add(timer, forMode: .defaultRunLoopMode)

PlaygroundPage.current.needsIndefiniteExecution = true

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

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

4 个答案:

答案 0 :(得分:13)

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'));

答案 1 :(得分:5)

通配符的放置'%'在LIKE子句中有所作为,C#有备份方法。以下是通配符的放置方式。

  

LIKE'%abc'

含义:找到任何以' abc'结尾的单词。

C#等效EndsWith

  

LIKE' abc%'

含义:找到以' abc'开头的任何单词,并且您不关心以后的文字。

C#等效StartWith

  

LIKE'%abc%'

含义:查找包含' abc'的任何字词,并且您不关心其出现的字词。

C#等效Contains

答案 2 :(得分:2)

您可以将ContainsmyTextColumn字段

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

答案 3 :(得分:1)

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

这样的东西
select ...
 where ... MyField like '%abc%'

我们可以尝试将表达式转换为相应的常规

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%")));