我正在使用C#构建查询。对于整数和字符串字段,情况非常简单。对于日期字段,我使用以下查询:
list.Where("myDateColumn >= DateTime(2017,1,20)");
我该如何在LINQ中执行以下SQL LIKE查询?
select * from table where myTextColumn LIKE '%abc%';
我正在使用C#构建查询。对于整数和字符串字段,情况非常简单。对于日期字段,我使用以下查询:
list.Where("myDateColumn >= DateTime(2017,1,20)");
我该如何在LINQ中执行以下SQL LIKE查询?
select * from table where myTextColumn LIKE '%abc%';
在 Linq 中,Like 操作有很多可能性:
对于 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'));
您可以使用Contains函数与myTextColumn
字段一起使用。
var date = new DateTime(2017,1,20);
list.Where(x => x.myDateColumn >= date && x.myTextColumn.Contains('abc'));
//assuming there is a db context with a table of Foos
await using var dbContext = new SqlContext();
//assuming table of Foos has Ipsum, Iptum, Ipuum
var result = dbContext.Foos.Where(x
=> EF.Functions.Like(x.Bar, "Ip_um"));
NotSupportedException
。EF.Functions.Like
和Contains
或StartsWith
之间的SQL翻译存在明显差异,这可能会影响性能。如果您确定正在使用服务器端评估并且性能很重要,请使用EF.Functions.Like
。
让我们尝试在一般情况下解决问题。假设我们得到的是这样的东西:
select ...
where ... MyField like '%abc%'
Like | Description |Regular
-------------------------------------------------
_ | any character (one and only one) | .
% | any characters (zero or more) | .*
Implementation
// 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%")));
在匹配之前,您可能需要将数据转换为字符串
:
var result list
.Where(x => Regex.IsMatch(x.myDate.ToString(), LikeToRegular("%abc%")));