2016-12-21 3 views
2

Для части базы данных ниже мне нужно найти, какая команда за сезон забила большинство голов за матч.Создать комплекс запроса LINQ

part of database

Для этого я использовал методы

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 команда с ку nt, если команды с max count == many, используется List это метод не крошечный, и я не знаю, как это сделать с запросом LINQ.

+0

Если несколько команд набрали одинаковое количество голов за матч, вы возвращаете все эти команды? Ваш код говорит «да», но ваше описание говорит «нет». Также неверно соотношение между «Матчи» и «Результаты». Результат может иметь только 1 матч, нет? Соответствующие отношения - это 1-1 или просто удаление результатов все вместе – Shoe

+0

Да, отношения 'Соответствует' и 'Результаты' нужно 1-1, спасибо – Venedchuk

+0

@Shoe либо ошибочно, либо ОП пытается/попросили получить все возможные результаты по таблица и только ссылка в каждом совпадении соответствуют результату –

ответ

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 для баз данных.

Если вы хотите только один, вы можете сделать First(), но это будет выбирать первый и игнорировать других в зависимости от заказа. SingleOrDefault() возвращает null, когда это ничья, если это то, что вы хотите.

EDIT: Для того, чтобы получить все матчи во всех турах, вы могли бы сделать что-то вроде этого: GetAllTours(...).SelectMany(tour => GetMatches(tour)) , но так как вы имеете дело с базой данных, вы можете просто попросить все матчи непосредственно.