Запрос LINQ - неверное значение счетчика - PullRequest
0 голосов
/ 07 мая 2020

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

Исходный SQL, который был дан, довольно плохо организован и имеет большое количество вложенных запросов. Это один из них. Я разбил запрос на его основной компонент и теперь собираю его обратно вместе с LINQ.

SQL, с которым я работаю, находится здесь:

    DECLARE @QSCollectionId UNIQUEIDENTIFIER = 'f52ec043-b360-4266-f95f-08d7c66074pe';

SELECT fieldid
       Count(fieldid) AS fieldcount, 
       Sum(CASE 
             WHEN answer = [value] AND Answer IS NOT NULL THEN 1 
             ELSE 0 
           END)       AS FieldAnswerMatchCount 
FROM   (SELECT DISTINCT FCI.fieldid, 
                        answer, 
                        QSA.qsrid, 
                        FAG.fieldid AS dependentfield, 
                        FAG.value 
        FROM   forms.fieldconstraints FCI 
               INNER JOIN forms.sectionfieldmappings SFM 
                       ON FCI.fieldid = SFM.fieldid 
               INNER JOIN forms.qssectionmappings QSSM 
                       ON SFM.sectionid = QSSM.sectionid 
               INNER JOIN sessions.qsr 
                       ON QSSM.qsid = qsr.qsid 
 --AND Qsr.QSCollectionId=@QSCollectionId
               LEFT JOIN forms.answerguides FAG 
                      ON 
               FCI.dependantanswerguideid = FAG.answerguideid 
               LEFT JOIN sessions.qsranswers QSA 
                      ON FAG.fieldid = QSA.fieldid 
                         AND Qsr.QsrId = QSA.qsrid                         
       ) AS 
       FieldConstr 
GROUP  BY fieldid   

LINQ

var id = Guid.Parse("f52ec043-b360-4266-f95f-08d7c66074be");

var firstResultPartThree = (from fci in FieldConstraints
                            join sfm in SectionFieldMappings on fci.FieldId equals sfm.FieldId
                            join qssm in QSSectionMappings on sfm.SectionId equals qssm.SectionId
                            join qsr in QSRs on new { qssm.QSId } equals new { qsr.QSId }
                            join ag in AnswerGuides on fci.DependantAnswerGuideId  equals ag.AnswerGuideId  into agResult
                            from agJoin in agResult.DefaultIfEmpty()
                            join qsrAnswers in QSRAnswers on new { agJoin.FieldId, qsr.QsrId } equals new {qsrAnswers.FieldId, qsrAnswers.QsrId} into qsrAnswersResult
                            from qsrAnswersJoin in qsrAnswersResult.DefaultIfEmpty()
                            //where qsr.QSCollectionId == id
                            select new {
                                FieldId = fci.FieldId, 
                                Answer = qsrAnswersJoin.Answer, 
                                QsrId = (Guid?)qsrAnswersJoin.QsrId, 
                                DependentFieldId = agJoin.FieldId, 
                                Value = agJoin.Value
                            }
                            );

    firstResultPartThree.Dump();

var firstResultPartTwo = (from fr in firstResultPartThree
                          where fr.FieldId == Guid.Parse("98CA6B6F-4070-4CEB-E9F1-08D7C66278F9")
                          group fr by fr.FieldId into grp

                          select new {
                                FieldId = grp.Key,
                                Fieldcount = grp.Count(),
                                FieldAnswerMatchCount = grp.Count(x => (Guid?)grp.Key.Value != null)
                          }
                         );

Результат LINQ в приведенном ниже примере дает мне

FieldId | fieldcount | FieldAnswerMatchCount

98ca6b6f-4070-4ceb-e9f1-08d7c66278f9 | 4 | 4 |

Результат sql для тех же данных:

98ca6b6f-4070-4ceb-e9f1-08d7c66278f9 | 3 | 2 |

Область, с которой я борюсь, это

 select new {
                FieldId = grp.Key,
                Fieldcount = grp.Count(),
                FieldAnswerMatchCount = grp.Count(x => (Guid?)grp.Key.Value != null)

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

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