LINQを使用して、Entity Frameworkテーブルの1つを検索し、名前に基づいて「グループ」を見つけています。名前は文字列で、Unicodeのように見えます(edmxにあると言います)。メソッドGetGroup()
があり、検索する名前を渡します。コードをデバッグすると、データベースに "Test"という名前のグループが既にあります。 「TEST」という名前のグループを渡すと、すでにデータベースにあった「Test」を返すことが期待されます。なんらかの理由で「テスト」が見つからず、「テスト」が存在しないと思われます。これが私のクエリですが、なぜ機能しないのかわかりません。助けてください。
「name」はグループ名で渡されます。俺の .Equals
は、gr.Name
と名前はまったく同じです。 2つの文字列のいずれかで1つの文字が大文字の場合、.Equalsは機能しません。私はInvariantCultureIgnoreCase
を使用しようとしましたが、役に立たなかったようです。誰かが尋ねた場合、MyLeagueId
とLeagueId
は常に一致します。データベースは、異なるリーグIDのグループが存在できるように設定されています。これは問題ではないと思います。
Group g = (from gr in this.DatabaseConnection.Groups
where gr.Name.Equals(name, StringComparison.OrdinalIgnoreCase) &&
gr.LeagueId == this.MyLeagueId
select gr).FirstOrDefault();
LINQ to Entitiesを使用すると、LINQ to SQLに自動的に変換されます。そして、.Equals onを実行しているデータベースフィールドにNOCASE(この例ではSQLite)のコレートがない場合は、常に大文字と小文字が区別されます。つまり、データベースでは、コードではなく文字列比較を行う方法が定義されています。
StringComparison.OrdinalIgnoreCase
との文字列比較は、メモリ内またはIEnumerable<T>
で機能します。 IQueryable<T>
で使用しようとしていますが、クエリ可能オブジェクトのプロバイダーはそれを理解していません。
これは私にとってはうまくいきます:
db.Users.FirstOrDefault(
s => s.Username.Equals(username, StringComparison.OrdinalIgnoreCase)
);
いくつかの研究を行いました。できません。照合(比較のタイプ)は、テーブルの列レベルで定義されます。 EFで変更することはできません。大文字と小文字を区別しないように定義されている場合、すべての検索で大文字と小文字が区別されません。大文字と小文字を区別するように定義されている場合、唯一の希望は文字列ToUpper()
です。
SQLに変換できるため、String.Compare()
を使用します。
ここ はLinqでの文字列照合の例で、Sql変換も含まれます。
技術的な観点から、TravyGuyの回答が気に入っています。より直接的で実用的な答えを得るには、以下を使用してみてください。
string.Compare(string A, string B, StringComparison.OrdinalIgnoreCase) == 0
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)