Лучшие результаты LINQ to SQL - PullRequest
       1

Лучшие результаты LINQ to SQL

1 голос
/ 15 декабря 2011

У меня есть одна таблица для моего онлайн-рекорда под названием «HighScore». Эта таблица содержит следующие столбцы:

Id, int (автоматическое значение) Имя, строка (имя игрока) Guid, строка (идентификатор игрока) Оценка, int (оценка) Coins, int (монеты игрока) Создано, дата / время (дата создания)

Что мне нужно, так это 50 лучших результатов, сгруппированных по Guid. Я нашел выражение LINQ, которое работает почти. Как получить строку MAX с запросом GROUP BY в запросе LINQ?

В конце мне нужен список моих объектов HighScore. С выражением выше я получаю анонимный список.

Edit: На самом деле мой стол называется «CatGameScore», но я изменил его в этом посте.

Содержание таблицы (указатели и даты только что показаны)

Id     Name     Guid     Score     Coins     Created
1      Hugo     123-123  150       10        <date>
2      Peter    456-456  600       19        <date>
3      Hugo     123-123  550       26        <date>

Мой вывод должен быть таким:

Id     Name     Guid     Score     Coins     Created
2      Peter    456-456  600       19        <date>
3      Hugo     123-123  550       26        <date>

Выходные данные должны быть списком. Я могу получить 50 лучших результатов на человека, но не могу создать список своих объектов.

Спасибо за любые подсказки.

Andy

Ответы [ 4 ]

1 голос
/ 15 декабря 2011

В дополнение к этому: Как получить строку MAX с запросом GROUP BY в запросе LINQ?

вам нужно использовать Взять и Пропустить метод, который поможет вам в достижении вашей задачи.

что-то вроде

MyScoreCollection.OrderByDescending(x => x.Score).Take(50) .GroupBy(x => x.Guid); 
1 голос
/ 15 декабря 2011

Хорошо, что-то вроде этого могло бы сработать

//assuming you have a List<HighScore>
var scores = new List<HighScore>();

РЕДАКТИРОВАТЬ: Получить все оценки из базы данных (один раз нажмите db). Затем вы можете работать с объектом Tuple без перевода в SQL

.
scores = (from s in context.ScoreSet //or something like this
         select s).ToList();

КОНЕЦ РЕДАКТИРОВАНИЯ

//get list of Tuples containing player Id and max score
var topScores = from s in scores
                group s.Score by s.Guid into grouping
                orderby grouping.Max() descending
                select new Tuple<string, int>(grouping.Key, grouping.Max()).Take(50);

//get matching HighScore records from List<HighScore>
var scoreRecords = from score in scores
                   let tuple = new Tuple<string, int>(score.Guid, score.Score)
                   where topScores.Contains(tuple)
                   select score;
1 голос
/ 15 декабря 2011

Как то так?

context.HighScoreSet.OrderByDescending(x => x.Score)
                    .Take(50)
                    .GroupBy(x => x.Guid);
0 голосов
/ 15 декабря 2011

Вот мой ответ, я назвал HighScore таблицу Scores, потому что это кажется мне более правильным.

var highScorePerPlayer =
    scores.GroupBy(
        s => s.Guid,
        s => s.Score,
        (playerID, scores) => 
            new KeyValuePair<string,int> (playerID, scores.Max()));

var top50HighScores = highScorePerPlayer.OrderByDescending(hs => hs.Value)
    .Take(50);

Из прочтения вопроса я думаю, что вы хотите получить отличную оценку от каждого игрока, поэтому каждый игрок появится в списке только один раз. Если это не так, вы должны отменить операции, как и другие ответы. Результатом будет IEnumerable<KeyValuePair<string, int>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...