LINQ дает результаты разницы до SQL - PullRequest
0 голосов
/ 05 мая 2020

Мне было поручено заменить запрос SQL запросом LINQ, и в основном я получаю данные, которые я ожидал, однако я думаю, что есть соединение, которое где-то пошло не так, и я не уверен, как или где, как правило, я избегаю EF, где могу, в пользу dapper.

SQL, который мне дали

    SELECT
            SFM.FieldId,
            QSRA.Answer,
            SFM.FieldNo
    FROM
            [forms].QS
        INNER JOIN
            [sessions].QSR
                ON QSR.QSNo = QS.QSNo
        INNER JOIN
            (
                SELECT
                        MAX(QS.QSVersion) AS LatestVersion
                FROM
                        [forms].QS
                    INNER JOIN
                        [sessions].QSR
                            ON QSR.QSNo = QS.QSNo
                WHERE
                        QSR.QsrId = @QSRID
                        AND QS.StatusId = 2
            )                            AS QSLatestVer
                ON QS.QSVersion = QSLatestVer.LatestVersion
        INNER JOIN
            [forms].QSSectionMappings    QSM
                ON QSM.QSId = QS.QSId
        INNER JOIN
            [forms].SectionFieldMappings SFM
                ON SFM.SectionId = QSM.SectionId
        INNER JOIN
            [sessions].QSRAnswers        QSRA
                ON (
                       QSRA.QsrId = QSR.QsrId
                       AND QSRA.FieldNo = SFM.FieldNo
                   )
    WHERE
            QSR.QsrId = @QSRID;

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

var results = (from qs in QS

               join qsr in QSRs on qs.QSNo equals qsr.QSNo
               join qsm in QSSectionMappings on qs.QSId equals qsm.QSId
               join sfm in SectionFieldMappings on qsm.SectionId equals sfm.SectionId
               join qsra in QSRAnswers on qsr.QsrId equals qsra.QsrId
               join sub in (from subQs in QS
                     join subQsr in QSRs on subQs.QSNo equals subQsr.QSNo
                     where subQs.StatusId == 2 && subQsr.QsrId == Guid.Parse(qsrIdGuid)
                     select subQs.QSVersion
                 ) on qs.QSVersion equals sub
               where qsr.QsrId == Guid.Parse(qsrIdGuid)
               group new
               {
                   FieldId = sfm.FieldId,
                   Answer = qsra.Answer,
                   FieldNo = decimal.Parse(sfm.FieldNo),
               } by new
               {
                   FieldId = sfm.FieldId,
                   Answer = qsra.Answer,
                   FieldNo = sfm.FieldNo
               } into g

                 select new
                 {
                     FieldId = g.Key.FieldId,
                     Answer =  g.Key.Answer,
                     FieldNo = g.Key.FieldNo, 

               }
);

Результаты, которые я получаю с помощью SQL:

FieldId | Answer | FieldNo

40D10975-AF2E-4518-AC35-08D7C70E1BF9 | 3 / 17/2020 12:00:00 AM | 1

71A95FD5-08E0-4201-AC36-08D7C70E1BF9 | 25.03.2020 12:00:00 AM | 2

Результаты, которые я получаю с LINQ:

FieldId | Answer | FieldNo

40d10975-af2e-4518-ac35-08d7c70e1bf9 | 17.03.2020 12:00:00 AM | 1 - Правильно

40d10975-af2e-4518-ac35-08d7c70e1bf9 | 25.03.2020 12:00:00 | 1 - Неправильно

71a95fd5-08e0-4201-ac36-08d7c70e1bf9 | 17.03.2020 00:00:00 | 2 - Неправильно

71a95fd5-08e0-4201-ac36-08d7c70e1bf9 | 25.03.2020 00:00:00 | 2 - Правильно

Буду признателен, если вы дадите мне знать, где я ошибаюсь при соединении

Результаты такие же с вложенным выбором и группировкой, как без группировки.

1 Ответ

1 голос
/ 05 мая 2020

В SQL у вас есть следующее для присоединения к QSRAnwers таблице

INNER JOIN
    [sessions].QSRAnswers        QSRA
        ON (
               QSRA.QsrId = QSR.QsrId
               AND QSRA.FieldNo = SFM.FieldNo
           )

Однако в коде Linq у вас есть

join qsra in QSRAnswers on qsr.QsrId equals qsra.QsrId

Итак, вам не хватает FieldNo сравнение для этого соединения. Просто измените его на

join qsra in QSRAnswers 
    on new{qsr.QsrId, sfm.FieldNo} equals new{qsra.QsrId, qsra.FieldNo}

, чтобы получить ту же функциональность.

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