【发布时间】:2020-08-20 08:32:17
【问题描述】:
我的任务是用 LINQ 查询替换 SQL 查询,主要是我得到了我期望的数据,但是我认为有一个连接在某个地方出错了,我不确定如何或在哪里大多数时候我会避开 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 |3/25/2020 12:00:00 AM |2
我用 LINQ 得到的结果是
FieldId |Answer |FieldNo
40d10975-af2e-4518-ac35-08d7c70e1bf9 |2020 年 3 月 17 日凌晨 12:00:00 |1 --正确
40d10975-af2e-4518-ac35-08d7c70e1bf9 |3/25/2020 12:00:00 AM |1 --错误
71a95fd5-08e0-4201-ac36-08d7c70e1bf9 |3/17/2020 12:00:00 AM |2 --错误
71a95fd5-08e0-4201-ac36-08d7c70e1bf9 |2020 年 3 月 25 日凌晨 12:00:00 |2 --正确
如果你能告诉我我在加入中哪里出错了,我将不胜感激
嵌套选择和分组的结果与没有分组的结果相同。
【问题讨论】:
-
你有没有试过看到actual SQL query?
-
您对
QSRAnswers的联接没有两个比较。试试new{qsr.QsrId, sfm.FieldNo} equals new{qsra.QsrId, qsra.FieldNo}另外,为什么你在 LINQ 中做一个 group by 而你不在 SQL 中做一个? -
@GuruStron 是的,由于某种原因,我无法将其正确引入解决方案
-
@juharr 我尝试了该组,因为我得到的结果比我预期的要多。我应该在代码中的哪个位置尝试新的实例,就像您的评论一样?
-
你应该使用
join qsra in QSRAnswers on new{qsr.QsrId, sfm.FieldNo} equals new{qsra.QsrId, qsra.FieldNo}而不是join qsra in QSRAnswers on qsr.QsrId equals qsra.QsrId这就是你可以在 Linq 中进行复合 FK 连接的方法。