Мне было поручено заменить запрос 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 - Правильно
Буду признателен, если вы дадите мне знать, где я ошибаюсь при соединении
Результаты такие же с вложенным выбором и группировкой, как без группировки.