我正在用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)");
答案 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)
您可以将Contains与myTextColumn
字段
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%")));