3

もともと私はこの方法を持っていました:

public virtual User GetUser(string username)
        {
            return _db.Users.Single(x => x.UserName == username);
        }

つまり、基本的には、ユーザーのユーザー名に基づいてユーザーを取得するlinqメソッドです。

問題は、ユーザー名の先頭に大文字が含まれていることがあるため、常に機能するとは限らないことです。

それで私は思いついた:

public virtual User GetUser(string username)
        {
            return _db.Users.Single(x => (string.Compare(x.UserName, username, true) == 0));
        }

これは機能します。しかし、私はこれが文字列を実行するのに本当に非効率的であるに違いないと思います。ユーザーと比較しますか?

string.Compareなしでこれを書くためのより良い方法はありますか?

4

3 に答える 3

10

String.Compareは、エンティティフレームワークでサポートされている関数のリストに含まれていません(サポートされている関数リストを参照)。これは、このクエリを実行すると、エンティティフレームワークがこの比較を実行し、ローカルで比較を実行するために必要なデータセット全体を取得することを意味します。これは非常に遅くなります。

はるかに優れた解決策は、==を使用して文字列を比較することです。次に例を示します。

return _db.Users.Single(x => x.UserName == username);
于 2012-04-18T05:23:32.530 に答える
4

私は使うだろうString.Equals

return _db.Users.Single(x => 
          String.Equals(x.UserName, username, StringComparer.OrdinalIgnoreCase))

「Martín」と「martin」(アクセント)を同じように一致させたい場合は、を使用しますString.Compare

return _db.Users.Single(x => 
         string.Compare(x.UserName, username, CultureInfo.CurrentCulture, CompareOptions.IgnoreNonSpace);
于 2014-08-14T23:44:52.073 に答える
2
public virtual User GetUser(string username)
        {
            return _db.Users.Single(x => x.UserName.ToLower() == username.ToLower());

        }

しかし、比較がそれほど遅くなるとは思いません。

于 2012-04-18T04:29:39.333 に答える