0

好的,我想使用实体框架查询中的 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 特定的东西,不能在数据库之间移植。

4

2 回答 2

0

没有办法让 EFLIKE在其查询中使用,但是您可以编写一个存储过程来查找使用LIKE输入参数的用户并使用 EF 来访问您的存储过程。

但是,您的特殊情况似乎更像是数据完整性问题。username.Trim()出于这个原因,您不应该允许用户注册以空格 ( ) 开头或结尾的用户名。一旦你这样做了,这个特定的问题就会完全消失。

此外,允许对身份验证详细信息进行“粗略”匹配是不安全的。不要这样做。

于 2013-02-15T10:40:37.437 回答
0

好吧,正如我在问题中提到的那样,似乎没有办法让 EF 使用LIKE运算符而不在开头或结尾填充通配符,所以我最终使用了这种组合,虽然有点难看,与LIKE没有任何通配符的 a 具有相同的效果:

context.Users.Where(usr =>
    usr.Username.StartsWith(usernameToMatch) &&
    usr.Username.EndsWith(usernameToMatch) &&
    usr.Username == usernameToMatch
)

所以,如果值是LIKE '[usernameToMatch]%'和它是LIKE '%[usernameToMatch]'和它,= '[usernameToMatch]'那么它完全匹配。

于 2013-03-19T10:51:16.037 回答