public List<PublicGameSummary> GetRecentPublicGames(RecentlyPlayedGamesFilter filter)
{
var query = dataContext.GetQueryable<PlayedGame>();
if (filter.BoardGameGeekGameDefinitionId.HasValue)
{
query = query.Where(x => x.GameDefinition.BoardGameGeekGameDefinitionId == filter.BoardGameGeekGameDefinitionId);
}
var publicGameSummaries = (from playedGame in query group new PublicGameSummary
{
PlayedGameId = playedGame.Id,
GameDefinitionId = playedGame.GameDefinitionId,
GameDefinitionName = playedGame.GameDefinition.Name,
GamingGroupId = playedGame.GamingGroupId,
GamingGroupName = playedGame.GamingGroup.Name,
WinnerType = playedGame.WinnerType,
WinningPlayer = playedGame.PlayerGameResults.FirstOrDefault(player => player.GameRank == 1).Player,
DatePlayed = playedGame.DatePlayed,
ThumbnailImageUrl = playedGame.GameDefinition.BoardGameGeekGameDefinition == null
? null : playedGame.GameDefinition.BoardGameGeekGameDefinition.Thumbnail,
BoardGameGeekObjectId = playedGame.GameDefinition.BoardGameGeekGameDefinitionId
}
by playedGame.GamingGroupId
into gamingGroups
select gamingGroups
.OrderByDescending(x => x.DatePlayed)
.ThenByDescending(y => y.PlayedGameId)
.FirstOrDefault()
)
.OrderByDescending(x => x.DatePlayed)
.ThenByDescending(y => y.PlayedGameId)
.Take(filter.NumberOfGamesToRetrieve)
.ToList();
foreach (var publicGameSummary in publicGameSummaries)
{
publicGameSummary.BoardGameGeekUri =
BoardGameGeekUriBuilder.BuildBoardGameGeekGameUri(publicGameSummary.BoardGameGeekObjectId);
}
return publicGameSummaries;
}