Entity Framework を使用して SQL からデータを取得しています。
以下のスニペットのようなコードを書きました。はデータベースからの値でSomething
あることに注意してください。さらに、 「0123456789-01」のように、すべての値が 10 桁、ハイフン、さらに 2 桁varchar
で構成されていることも関係があると思います。Something
(これは悪い設計だということを忘れないでください。私はこのデータベースのアーキテクトではありません。)
var X = Entities.MyView
.Select(x => x.Something)
.Distinct();
// 5850 elements
var Y = Entities.MyView
.GroupBy(x => x.Something);
// 5850 elements
var Z = Entities.MyView
.ToArray()
.GroupBy(x => x.Something);
// 5727 elements
// Added in response to user995219's Answer
var ZZ = Entities.MyView
.GroupBy(x => x.Something)
.ToArray();
// 5850 elements
最初のステートメントはSomething
、ビューから列の個別の値を取得しますMyView
。結果として 5850 要素が得られます。これは私が期待するものです。
2 番目のステートメントは、ビュー全体をプルダウンし、それを の一意の値でSomething
グループ化し、5850 個のグループ化を生成します。これは私が期待するものです。
ToArray
3 番目のステートメントは、 の値を呼び出す点を除いて、まったく同じMyView
です。通常、呼び出しコードがデータ全体を使用し、遅延読み込み SNAFU を処理したくない場合にこれを行います。ただし、デバッガーでこのコードを実行すると、この 3 番目のステートメントによって 5727 個のグループが生成され、予想よりも 123 個少なくなります。
編集:GroupBy
4 番目のステートメントは、 andToArray
メソッドのチェーンの順序を単純に逆にします。この小さな変更を行うと、期待する行数が得られますが、実際の問題には、この SQL 呼び出しからのデータを他のデータと関連付けて単一のオブジェクトで返すコードがあるため、この質問をこの方法で解決できないという実際の問題があります。 .
ToArray
を使用すると間違った数の結果が得られることを理解したいと思います。
フォローアップ: user995219 の回答に応えMyView
て、追加の列を持つように書き直しました:からハイフンを省略し、結果を単一の整数と見なすことSomethingInt
によって形成された 32 ビット整数を単純に含みます。Something
次に、LINQ コードはGroupBy
新しく作成された整数に対して処理を行います。
ただし、この変更を行っても、私はまだ同じ問題を抱えています。
var A = Entities.MyView
.ToArray();
// Returns 17893 elements, the same as if I ran SELECT * FROM MyView
var array0 = A.Select(x => x.SomethingInt).Distinct();
// Returns 5727 elements when I expect 5850
SQL では、SELECT COUNT(DISTINCT(SomethingInt)) FROM MyView;
予想どおり 5850 を返します。
これにより、.net フレームワークのあらゆる種類の文字列比較が取り除かれますが、問題は解決しません。