私の 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 ステートメントはどのように見えるでしょうか? それとも別の方法で行うことができますか?