LINQ grp.Max (...) не дает только максимальное значение - PullRequest
0 голосов
/ 06 мая 2020

Я работаю с LINQ \ EF и пытаюсь заменить SQL Stored Pro c, используя Dapper с Entity Framework.

Я на 99% согласен с определенным аспектом вызова, однако я получаю 2 слишком много результатов, потому что выбор не получает только максимальное значение.

SQL

SELECT
    MAX(QS.QSVersion) AS LatestVersion,
    QS.QSNo           AS VerQSno
FROM
    [forms].QS
INNER JOIN
    [forms].QSCollectionMappings qsc
        ON qsc.QSNo = QS.QSNo
WHERE
    qsc.QSCollectionTypeId = @QSCollectionTypeId
    AND QS.StatusId = 2
GROUP BY
    QS.QSNo;

LINQ

ar join = (from qs in QS
            join qscm in QSCollectionMappings on 
                    new { QuestionNumber = qs.QSNo, Version = qs.QSVersion } equals 
                    new {QuestionNumber = qscm.QSNo, Version = qscm.QS.QSVersion} 
            where qscm.QSCollectionTypeId == collectionId && qs.StatusId == 2
            group qs by new
            {
                QuestionNumber = qs.QSNo,
                QuestionVersion = qs.QSVersion,

            } into grp
            select new {
                QuestionNumber = grp.Key.QuestionNumber,
                QuestionVersion = grp.Max(x => x.QSVersion)
            });

Результаты

 The results 

     QSNo   |Version

|34 |-| 1.0 |
|38 |-| 1.0 |  // Should not show
|276|-| 1.0 |  // Should not show
|38 |-| 2.0 |
|276|-| 2.0 |

Я был бы признателен, если бы меня посоветовали о том, что я сделал здесь не так, чтобы я мог исправить проблему.

Спасибо

Саймон

1 Ответ

2 голосов
/ 06 мая 2020

Вы группируете как QSNo, так и QSVersion, технически каждая уникальная комбинация будет в отдельной группе, что означает, что результаты верны.

Вместо этого вам следует сделать следующее: group только для QSNo, а затем используйте Max для версий.

Я не могу проверить код, но этот фрагмент должен работать:

    var join = (from qs in QS
        join qscm in QSCollectionMappings on 
                new { QuestionNumber = qs.QSNo, Version = qs.QSVersion } equals 
                new {QuestionNumber = qscm.QSNo, Version = qscm.QS.QSVersion} 
        where qscm.QSCollectionTypeId == 3 && qs.StatusId == 2
        group qs by qs.QSNo into grp
        select new {
            QuestionNumber = grp.Key,
            QuestionVersion = grp.Max(p => p.QSVersion)
        });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...