0

これが重複している場合は、お詫び申し上げます。私は検索の分担をしましたが、何を検索するかを考え出しました。

学生データベースがあり、性別に基づいてスコアを平均したいとします。標準的な課題リレーショナル データベースでは、これは非常に簡単です。明示的な結合を伴うクエリが必要な場合や、ナビゲーション プロパティなどを使用する場合もありますが、次のようになります。

var averageScore = db.Grades
    .Where(grade => grade.Student.Gender == selectedGender)
    .Average();

しかし、ドキュメント ベースのシステムに接続していて、データ構造が、Grade オブジェクトのコレクションが埋め込まれた単なる Student オブジェクトである場合はどうでしょうか。

var averageScore = db.Students.GroupBy(student => student.Gender)
    .ThisDoesNotWork(no => matter.What);

値のコレクションを、共通のキーを共有する単一の値のコレクションに変換する GroupBy を実行するために、3 ダースの異なる方法を試しましたが、どれもうまくいきませんでした。私の試行のほとんどは、GroupBy 内で SelectMany を試行することを伴いました。それが可能であれば、コンパイラが私のベッドサイドでのやり方を気に入らないとだけ言っておきましょう。

編集:「フォーマット」の意味がわかりません。私たちが話しているデータ構造は、そのメンバーの 1 つとしてコレクションを持つ単なるクラスです。

class Student
{
    public string Name { get; set; }
    public Gender Gender { get; set; }
    public ICollection<int> Grades { get; set; }
}
4

2 に答える 2

0

リッチの答えは、私が少し難しく考えSelectMany()させられたので(さらに、私は仕事を辞めて退屈していました)、もう少し仕事をして、ここに私が得たものがあります:

var averagesByGender = db.Students
    .SelectMany(
        student => student.Grades,
        (student, grade) => new { Gender = student.Gender, Grade = grade })
    .GroupBy(
        record => record.Gender,
        record => record.Grade)
    .Select(group => new { group.Key, Average = group.Average() });

これSelectMany()は、任意の SQL データベースでの結合ステートメントとほとんど同じように機能します。関連する学生情報を含む 1 学年ごとに 1 つのレコードを取得し、そこから、昔ながらの方法 (または、私の例のように) で必要なクエリを実行できます。 、表された性別ごとに 1 つの結果を得ることができます)。

唯一の問題は、明らかに、これはリレーショナルすぎるということです... RavenDB のように、クエリに変換しようとすることを拒否します。幸いなことに、それを後ろに隠しても問題ありません.ToList()。MongoDB でも同じように動作するのだろうか。

于 2013-10-12T02:50:21.387 に答える