【问题标题】:LINQ giving difference results to SQLLINQ 为 SQL 提供不同的结果
【发布时间】: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 连接的方法。

标签: c# linq


【解决方案1】:

在 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}

获得相同的功能。

【讨论】:

  • 我有一个类型问题并且它没有转换,但是如果我有正确的类型,这应该可以工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-07
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多