2016-12-21 11 views
2

以下のデータベースでは、シーズン中のどのチームが1試合につきほとんどのゴールを集めているのかを知る必要があります。そのために複雑なLINQクエリを作成する

part of database

私はSimpleTeamがCOUとチームである方法

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){...} 

を使用しました最大得点==多くのチームがList を使用していれば、それは方法ではなく、LINQクエリでどのように行うのかわかりません。

+0

複数のチームが1試合で同じゴール数を獲得した場合は、それらのチームをすべて返却していますか?あなたのコードは「はい」と言っていますが、あなたの説明は「いいえ」と言います'Matches'と' Results'の関係も間違っています。結果は1つしか一致しない場合もあります。適切な関係は1-1であるか、または単に削除する結果ともに – Shoe

+0

はい、関係「一致」と「結果」が必要です1-1、ありがとうございます – Venedchuk

+0

@Shoeが間違っているか、またはOPがすべての可能な結果を​​得ようとしています各マッチのテーブルと参照のみが対応する結果 –

答えて

1

非常に効率的ではありませんが、私の考えは、このようなものになるだろう:TeamScoreはシンプルな構造体をある

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); 

これは、(同じ数字だった場合は)最も多くのゴールを記録したすべてのチームでIEnumerableを返します。おそらくプロパティ名やその他の詳細の一部を変更する必要があります。私はLINQデータベースに精通していません。

1つだけ必要な場合は、First()を実行することができますが、最初のものを選択し、順序によっては他のものを無視します。 SingleOrDefault()は描画のときにnullを返します。これが必要な場合はnullです。

EDIT:全てのツアーですべての一致を取得するには、このようなものだろう: GetAllTours(...).SelectMany(tour => GetMatches(tour)) をしかし、あなたは、データベースを扱っていることから、あなただけの直接のすべての一致を求めることができます。

関連する問題