web-dev-qa-db-ja.com

String.Equals()が意図したとおりに機能しない

LINQを使用して、Entity Frameworkテーブルの1つを検索し、名前に基づいて「グループ」を見つけています。名前は文字列で、Unicodeのように見えます(edmxにあると言います)。メソッドGetGroup()があり、検索する名前を渡します。コードをデバッグすると、データベースに "Test"という名前のグループが既にあります。 「TEST」という名前のグループを渡すと、すでにデータベースにあった「Test」を返すことが期待されます。なんらかの理由で「テスト」が見つからず、「テスト」が存在しないと思われます。これが私のクエリですが、なぜ機能しないのかわかりません。助けてください。

「name」はグループ名で渡されます。俺の .Equalsは、gr.Nameと名前はまったく同じです。 2つの文字列のいずれかで1つの文字が大文字の場合、.Equalsは機能しません。私はInvariantCultureIgnoreCaseを使用しようとしましたが、役に立たなかったようです。誰かが尋ねた場合、MyLeagueIdLeagueIdは常に一致します。データベースは、異なるリーグIDのグループが存在できるように設定されています。これは問題ではないと思います。

Group g = (from gr in this.DatabaseConnection.Groups
           where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) &&
           gr.LeagueId == this.MyLeagueId
           select gr).FirstOrDefault();
40
Travyguy9

LINQ to Entitiesを使用すると、LINQ to SQLに自動的に変換されます。そして、.Equals onを実行しているデータベースフィールドにNOCASE(この例ではSQLite)のコレートがない場合は、常に大文字と小文字が区別されます。つまり、データベースでは、コードではなく文字列比較を行う方法が定義されています。

42
Travyguy9

StringComparison.OrdinalIgnoreCaseとの文字列比較は、メモリ内またはIEnumerable<T>で機能します。 IQueryable<T>で使用しようとしていますが、クエリ可能オブジェクトのプロバイダーはそれを理解していません。

これは私にとってはうまくいきます:

db.Users.FirstOrDefault(
     s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
35
Swapnil Malap

いくつかの研究を行いました。できません。照合(比較のタイプ)は、テーブルの列レベルで定義されます。 EFで変更することはできません。大文字と小文字を区別しないように定義されている場合、すべての検索で大文字と小文字が区別されません。大文字と小文字を区別するように定義されている場合、唯一の希望は文字列ToUpper()です。

http://connect.Microsoft.com/VisualStudio/feedback/details/435783/entity-framework-conceptual-model-doesnt-support-string-equals-via-linq

http://social.msdn.Microsoft.com/Forums/en/adodotnetentityframework/thread/3810aa67-f6fe-4624-a14b-eaaa0e05ddcd

EF4 Linq Oracle11gはクエリで大文字と小文字を区別しません

LINQ to Entitiesの大文字と小文字を区別する比較

9
xanatos

SQLに変換できるため、String.Compare()を使用します。

ここ はLinqでの文字列照合の例で、Sql変換も含まれます。

9
Jowen

技術的な観点から、TravyGuyの回答が気に入っています。より直接的で実用的な答えを得るには、以下を使用してみてください。

string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0
5

name.Equals(gr.Name, StringComparison.OrdinalIgnoreCase)をお試しください

それが機能する場合、問題はgr.Nameにある可能性があります。

---編集---

gr.NameのタイプがSystem.stringではないようです。 (String.Equalsは前の投稿からのエラー==>を与えるため)

これを試してください

(gr.Name as string).Equals(name, StringComparison.OrdinalIgnoreCase)

または

String.Equals((gr.Name as string), name, StringComparison.OrdinalIgnoreCase)
2
Viv