6

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 個のグループ化を生成します。これは私が期待するものです。

ToArray3 番目のステートメントは、 の値を呼び出す点を除いて、まったく同じ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 フレームワークのあらゆる種類の文字列比較が取り除かれますが、問題は解決しません。

4

2 に答える 2

5

ToArray ステートメントはクエリを実行し、group by は文字列等価比較子を使用してメモリ内で実行されます。最初の 2 つのステートメントは、SQL レベルで group by を実行します。違いがあります: .NET と T-SQL の文字列比較の違いは?

特に照合に関して。

于 2014-02-07T16:28:15.430 に答える