0

OK、かなり変わった理由で Entity Framework クエリから LIKE キーワードを使用したい -等号演算子を使用する場合よりも正確に文字列を照合したい。

equals 演算子は、一致する文字列をスペースで自動的に パディングして、実際に等しいORcol = 'foo 'の行を返すようにするため、末尾の空白を強制的に考慮したいのですが、LIKE 演算子は実際にそれを行います。col'foo''foo '

.StartsWithクエリで、.EndsWith、およびを使用して、Entity Framework に LIKE 演算子を強制的に使用させることができることを私は知ってい.Containsます。ただし、予想されるように、これにより EF は、クエリされたテキストをワイルドカード%文字でプレフィックス、サフィックス、および囲みます。ワイルドカード文字を追加せずに、SQL で LIKE 演算子を直接使用して、私のクエリの文字列と一致させるように実際に Entity Framework を取得する方法はありますか? 理想的には、次のようになります。

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

クエリでEF を使用する方法はありませんが、入力パラメーターを使用してLIKEユーザーを検索するストアド プロシージャを作成し、 EF を使用してストアド プロシージャをヒットすることはできます。LIKE

ただし、特定の状況は、データの整合性の問題のようです。スペース ( ) で開始または終了するユーザー名の登録をユーザーに許可するべきではありませんusername.Trim()。それを行うと、この特定の問題は完全になくなります。

また、認証の詳細で「大まかな」一致を許可することは、安全ではありません。やらないでください。

于 2013-02-15T10:40:37.437 に答える
0

LIKE質問で述べたように、最初または最後にワイルドカード文字をパディングせずに EF に演算子を使用させる方法はないようです。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 に答える