0

LinqPad でクエリを実行すると、奇妙な動作が発生することがわかりました。一部の ASCII 記号/文字は、実際には等しくない場合でも、LinqToSQL によって等しいと見なされるようです。

次のクラスを考えてみましょう (対応するテーブルを使用)。

public class SpecialCharacter
{
    int Id;
    string Character;
    string Name;
}

テーブルに「⇒」(右矢印) と「⇐」(左矢印) の行を追加すると、次のクエリはそれらが等しいことを示します (結果には 2 つの項目が含まれます)。

var result = from a in SpecialCharacters
             from b in SpecialCharacters
             where a.Character == b.Character  && a != b
             select new {A = a, B = b};

.ToList() への呼び出しを追加してクエリを変更すると、期待どおりの動作になります (結果は空です)。

var result = from a in SpecialCharacters.ToList()
             from b in SpecialCharacters.ToList()
             where a.Character == b.Character && a != b
             select new {A = a, B = b};

これがどのように起こるかについてのアイデアはありますか?

4

1 に答える 1

0

表示されている違いは、LINQが同等性を処理する方法とSQLサーバーの照合設定の違いによるものです。大文字と小文字を区別して検索した場合も、同じことがわかります。オブジェクトへのLINQ。次のクエリについて考えてみます。

var query = from c in Customers
            where c.City == "london"
            select c;

LINQ to Objectsはロンドンの都市と一致しますが、ロンドンやロンドンとは一致しません。一方、LINQ to SQLまたはEFは、大文字と小文字を区別しないため、デフォルトでこれら3つのいずれかに一致します。result.ToStringを調べて、LINQ to SQLで生成されたTSQLを確認し、生成されたSQLを確認してから、そのSQLをSSMSで直接実行することをお勧めします。同じ追加のレコードが返されるはずです。このクエリで正しい動作を得るには、照合設定またはその他のデータベース固有の設定を微調整する必要があります。

于 2012-09-06T13:33:08.683 に答える