好的,我想使用实体框架查询中的 LIKE 关键字是出于一个相当非正统的原因 - 我想比使用等于运算符时更精确地匹配字符串。
因为 equals 运算符会自动 填充要与空格匹配的字符串,以便col = 'foo '
实际返回col
等于'foo'
OR的行'foo '
,所以我想强制考虑尾随空格,而 LIKE 运算符实际上就是这样做的。
我知道您可以强制实体框架在查询中使用.StartsWith
,.EndsWith
和使用 LIKE 运算符。.Contains
但是,正如预期的那样,这会导致 EF 使用通配符对查询的文本进行前缀、后缀和包围%
。有没有办法让实体框架直接使用 SQL 中的 LIKE 运算符来匹配我的查询中的字符串,而不添加通配符?理想情况下,它看起来像这样:
string usernameToMatch = "admin ";
if (context.Users.Where(usr => usr.Username.Like(usernameToMatch)).Any()) {
// An account with username 'admin ' ACTUALLY exists
}
else {
// An account with username 'admin' may exist, but 'admin ' doesn't
}
我找不到直接执行此操作的方法;现在,我能想到的最好的就是这个黑客:
context.Users.Where(usr =>
usr.Username.StartsWith(usernameToMatch) &&
usr.Username.EndsWith(usernameToMatch) &&
usr.Username == usernameToMatch
)
有没有更好的办法?顺便说一句,我不想使用它,PATINDEX
因为它看起来像 SQL Server 特定的东西,不能在数据库之间移植。