有没有办法从实体框架查询中使用LIKE运算符?

时间:2013-02-15 10:32:50

标签: sql entity-framework sql-like

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

2 个答案:

答案 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]',那么它就会完全匹配。