创建复杂的LINQ查询

时间:2016-12-21 22:32:23

标签: c# sql entity-framework linq

对于下面的数据库部分,我需要找到赛季中每支球队得分最多的球队。

part of database

为此,我使用了方法

$ od -t x1 download
0000000 15 03 03 00 02 02 50
0000007

public List<Tour> GetAllTours(Guid seasonGuid){...}

public List<SimpleMatch> GetMatches(Guid tour)
{
    using (var db = new ConnectToDb())
    {
        if (!db.Matches.Any()) return new List<Match>();
        var matches = db.Matches;
        var matchesToReturn = new List<Match>();
        foreach (var item in 
            matches
                .Include(x => x.Home)
                .Include(x => x.Guest)
                .Include(x => x.Result)
                .Include(x => x.Tour))
        {
            if (item.Tour.Id != tour)
            matchesToReturn.Add(item);
        }

        return matchesToReturn;
    }
}

其中public List<SimpleTeam> GetTeamMostGoalInSeason(List<Match> matches){...} 是具有计数目标的团队,如果最大计数= =很多的团队使用SimpleTeam 它的方法不小,我不知道如何使用LINQ查询。

1 个答案:

答案 0 :(得分:1)

效率不高,但我的想法是这样的:

matches.SelectMany(match => new[] {
    new TeamScore {
        TeamId = match.HomeId,
        Goals = match.Result.HomeTeamGoals
    },
    new TeamScore {
        TeamId = match.GuestId,
        Goals = match.Result.GuestTeamGoals
    }
})
.GroupBy(score => score.Goals)
.OrderByDescending(group => group.Key)
.First()
.Select(score => score.TeamId);

其中TeamScore是一个简单的结构。

这将返回IEnumerable与所有得分最高的球队(如果是相同的数字)。您可能需要更改一些属性名称或其他详细信息。我不熟悉LINQ to databases。

如果你只想要一个,你可以做First()但是会选择第一个并根据顺序忽略其他的。 SingleOrDefault()在绘制时会返回null,如果这是你想要的。

编辑:要获得所有旅行中的所有比赛,你可以这样做: GetAllTours(...).SelectMany(tour => GetMatches(tour)) 但是既然您正在处理数据库,您可以直接询问所有匹配项。