LINQ 中的 LIKE 运算符
有没有什么方法可以比较 C# LINQ 表达式中的字符串,类似于 SQL 的 LIKE
运算符?
假设我有一个字符串列表。在此列表中我想搜索一个字符串。在 SQL 中,我可以这样写:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
查询需要 linq 语法,而不是上面的内容。
using System.Text.RegularExpressions;
…
var regex = new Regex(sDischargePort, RegexOptions.IgnoreCase);
var sPortCode = Database.DischargePorts
.Where(p => regex.IsMatch(p.PortName))
.Single().PortCode;
我的上述 LINQ 语法不起作用。我有什么错吗?
Is there any way to compare strings in a C# LINQ expression similar to SQL's LIKE
operator?
Suppose I have a string list. On this list I want to search a string. In SQL, I could write:
SELECT * FROM DischargePort WHERE PortName LIKE '%BALTIMORE%'
Instead of the above, query want a linq syntax.
using System.Text.RegularExpressions;
…
var regex = new Regex(sDischargePort, RegexOptions.IgnoreCase);
var sPortCode = Database.DischargePorts
.Where(p => regex.IsMatch(p.PortName))
.Single().PortCode;
My above LINQ syntax does not work. What have I got wrong?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
通常您使用
String.StartsWith
/EndsWith
/Contains
。例如:我不知道是否有办法通过 LINQ to SQL 执行正确的正则表达式。 (请注意,它确实取决于您使用的提供程序 - 在 LINQ to Objects 中这很好;问题在于提供程序是否可以将调用转换为其本机查询格式,例如 SQL。)
编辑:正如 BitKFu 所说,当您期望恰好一个结果时,应使用
Single
- 当情况并非如此时会出现错误。应根据预期使用SingleOrDefault
、FirstOrDefault
或First
选项。Typically you use
String.StartsWith
/EndsWith
/Contains
. For example:I don't know if there's a way of doing proper regular expressions via LINQ to SQL though. (Note that it really does depend on which provider you're using - it would be fine in LINQ to Objects; it's a matter of whether the provider can convert the call into its native query format, e.g. SQL.)
EDIT: As BitKFu says,
Single
should be used when you expect exactly one result - when it's an error for that not to be the case. Options ofSingleOrDefault
,FirstOrDefault
orFirst
should be used depending on exactly what's expected.正则表达式?不。但是对于该查询您可以使用:
如果您确实想要 SQL
LIKE
,您可以使用System.Data.Linq.SqlClient.SqlMethods.Like(.. .)
,LINQ-to-SQL 映射到 SQL Server 中的LIKE
。Regex? no. But for that query you can just use:
If you really want SQL
LIKE
, you can useSystem.Data.Linq.SqlClient.SqlMethods.Like(...)
, which LINQ-to-SQL maps toLIKE
in SQL Server.嗯...有时使用
Contains
、StartsWith
或EndsWith
可能会不舒服,尤其是当搜索值确定LIKE
时声明例如传递的“value%”要求开发人员在表达式中使用 StartsWith 函数。所以我决定为IQueryable
对象编写扩展。使用
代码
Well... sometimes it may be uncomfortable to use
Contains
,StartsWith
orEndsWith
especially when searching value determineLIKE
statment e.g. passed 'value%' require from developer to useStartsWith
function in expression. So I decided to write extension forIQueryable
objects.Usage
Code
在本机 LINQ 中,您可以使用
Contains/StartsWith/EndsWith
或 RegExp 的组合。在 LINQ2SQL 中,使用方法
SqlMethods.Like()
添加 Assembly: System.Data.Linq(在 System.Data.Linq.dll 中)来使用此功能。
In native LINQ you may use combination of
Contains/StartsWith/EndsWith
or RegExp.In LINQ2SQL use method
SqlMethods.Like()
add Assembly: System.Data.Linq (in System.Data.Linq.dll) to use this feature.
正如 Jon Skeet 和 Marc Gravell 已经提到的,您可以简单地采用包含条件。但对于 like 查询,采用 Single() 语句是非常危险的,因为这意味着您只能找到 1 个结果。如果有更多结果,您将收到一个很好的异常:)
所以我更喜欢使用 FirstOrDefault() 而不是 Single():
As Jon Skeet and Marc Gravell already mentioned, you can simple take a contains condition. But in case of your like query, it's very dangerous to take a Single() statement, because that implies that you only find 1 result. In case of more results, you'll receive a nice exception :)
So I would prefer using FirstOrDefault() instead of Single():
一个简单的
结果 ->安尼克·扬尼克
A simple as this
Result -> Annick,Yannick
理想情况下,您应该使用
StartWith
或EndWith
。这是一个例子:
Ideally you should use
StartWith
orEndWith
.Here is an example:
您可以使用谓词调用单个方法:
You can call the single method with a predicate:
也可以使用.net5中测试的EF功能
You can also use the EF function tested in .net5
这就像 SQL 的“LIKE”一样......
This works like "LIKE" of SQL...
Like 扩展 Linq / SQL
LikeExtension 类
中测试
在 .NET 5存储库
使用
Or
Or
Or
Or
Like Extension Linq / SQL
LikeExtension Class
Tested in .NET 5
Repository
Use
Or
Or
Or
Or
只需添加到字符串对象扩展方法即可。
用法:
Just add to string object extention methods.
usage:
@adobrzyc 有这个很棒的自定义
LIKE
函数 - 我只是想分享它的IEnumerable
版本。@adobrzyc had this great custom
LIKE
function - I just wanted to share theIEnumerable
version of it.@adobrzyc 提供的出色自定义 LIKE 功能
don'在 LINQPad 中对我来说不起作用。
这里的版本
在 LINQPad 中工作
(在 LINQPad 5 和 LINQPad 6 上测试)代码
Great custom LIKE function by @adobrzyc
don't work for me in LINQPad
.Here version which
work in LINQPad
(tested on LINQPad 5 and LINQPad 6)Code