0

私の RavenDB データベースには、Teams と Matches という 2 つの異なるドキュメント コレクションがあります。ドキュメントは次のようになります。

public class Team {
    public string Id { get; set; }
    public string Name { get; set; }
    public int LeaguePosition { get; set; }
}

public class Match {
    public string Id { get; set; }
    public string HomeTeamName { get; set; }
    public string AwayTeamName { get; set; }
    public DateTime StartTime { get; set; }
}

だから、基本的に私はチームを持っており、これらのチーム間で試合をしています。ただし、特定の操作では、データベースから次のようなエンティティを取得する必要があります。

public class MatchWithExtraData {
    public string Id { get; set; } // Id from the match document.
    public string HomeTeamId { get; set; }
    public string HomeTeamName { get; set; }
    public int HomeTeamPosition { get; set; }
    public string AwayTeamId { get; set; }
    public string AwayTeamName { get; set; }
    public int AwayTeamPosition { get; set; }
    public DateTime? StartTime { get; set; }
}

私が欲しいのは、実際には試合のドキュメントですが、ホーム チームとアウェイ チームの ID とリーグ ポジション用のフィールドが追加されています。基本的には、ホーム チームとアウェイ チームの名前で、ホーム チーム用とアウェイ チーム用の 2 つのチーム ドキュメントで試合ドキュメントを結合します。マルチマップ/リデュースインデックスがそのトリックを行うべきだと考えたので、次のインデックスから始めました:

public class MatchWithExtraDataIndex: AbstractMultiMapIndexCreationTask<MatchWithExtraData> {
    public MatchWithExtraData() {
        AddMap<Team>(
            teams => from team in teams
                     select new {
                         Id = (string)null,
                         HomeTeamId = team.Id,
                         HomeTeamName = team.Name,
                         HomeTeamPosition = team.LeaguePosition,
                         AwayTeamId = team.Id,
                         AwayTeamName = team.Name,
                         AwayTeamPosition = team.LeaguePosition,
                         StartTime = (DateTime?)null
                     }
        );
        AddMap<Match>(
            matches => from match in matches
                       select new {
                           Id = match.Id,
                           HomeTeamId = (string)null,
                           HomeTeamName = match.HomeTeamName,
                           HomeTeamPosition = 0,
                           AwayTeamId = (string)null,
                           AwayTeamName = match.AwayTeamName,
                           AwayTeamPosition = 0,
                           StartTime = match.StartTime
                       }
        );
        Reduce = results => from result in results
                            // NOW WHAT?
    }
}

縮小部分は、各試合に 2 つのチームがあるため、私が理解できない部分です。最初に HomeTeamName で、次に AwayTeamName でネストされたグループを実行する必要があると思いますが、その方法がわかりません。

おそらく、これは RavenDB の問題というよりも LINQ の問題です。しかし、そのようなネストされた group by ステートメントはどのように見えるでしょうか? それとも別の方法で行うことができますか?

4

1 に答える 1

0

そのためには Transform Results を使用するか、インクルードすることをお勧めします。ここのドキュメントを参照してください: http://ravendb.net/docs/client-api/querying/handling-document-relationships

于 2013-01-28T22:57:09.597 に答える