好的,我想使用实体框架查询中的LIKE关键字是出于一个非常不正统的原因 - 我想比使用equals运算符时更精确地匹配字符串 。
因为等于运算符automatically pads要与空格匹配的字符串使col = 'foo '
实际返回col
等于'foo'
OR {的行{1}},我想强制考虑尾随空格,LIKE运算符实际上是这样做的。
我知道您可以强制实体框架在查询中使用'foo '
,.StartsWith
和.EndsWith
来使用LIKE运算符。但是,正如所料,这会导致EF使用通配符.Contains
字符对查询后的文本进行前缀,后缀和环绕。有没有办法让我实际上可以让Entity Framework在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
)
因为它看起来像SQL Server特定的东西,不能在数据库之间移植。
答案 0 :(得分:0)
没有办法让EF在其查询中使用LIKE
但是您可以编写一个存储过程,使用带有输入参数的LIKE
查找用户并使用EF来点击您存储的过程
然而,您的特殊情况似乎更多是数据完整性问题。出于这个原因,您不应该允许用户注册以空格(username.Trim()
)开头或结尾的用户名。一旦你这样做,那么这个特殊的问题就完全消失了。
此外,允许对身份验证详细信息进行“粗略”匹配是不安全的。不要这样做。
答案 1 :(得分:0)
好吧,似乎没有办法让EF使用LIKE
运算符而不在开头或结尾用通配符填充它,正如我在我的问题中提到的那样,所以我最终使用了这个这个组合虽然有点难看,但与没有任何通配符的LIKE
具有相同的效果:
context.Users.Where(usr =>
usr.Username.StartsWith(usernameToMatch) &&
usr.Username.EndsWith(usernameToMatch) &&
usr.Username == usernameToMatch
)
因此,如果值为LIKE '[usernameToMatch]%'
且它为LIKE '%[usernameToMatch]'
且= '[usernameToMatch]'
,那么它就会完全匹配。