Linq to SQL запрос принимает вечно - PullRequest
1 голос
/ 27 января 2010

Хорошо, сначала я подумал, что у меня проблема с тем, как я запрашиваю вещи. Но, очевидно, проблема заключается в том, как linq переводит мой запрос в sql.

Вот мой linq:

var items = (from p in ctx.bam_Prestatie_AllInstances
             join q in ctx.bam_Zending_AllRelationships on p.ActivityID equals q.ReferenceData
             join r in ctx.bam_Zending_AllInstances on q.ActivityID equals r.ActivityID
             orderby p.LastModified descending
             where r.PrestatieOntvangen >= vanaf && r.PrestatieOntvangen <= tm
             select new Data.BAMPrestatieInstance
               {
                Aanvaard = p.PrestatieAanvaard,
                Contactnummer = r.ContactNr,
                Identificatie = p.Identificatie,
                Foutmelding = ((p.Foutmelding == "" || p.Foutmelding == null) && p.PrestatieAanvaard == null) ? "De prestatie is bezig met verwerkt te worden." : p.Foutmelding.Replace("\r\n", " "),
                Ontvangen = p.PrestatieZendingOntvangen,
                Uitvoerdatum = p.Uitvoerdatum.Replace('-', '/'),
                Zender = r.Zender,
                PrestatieCode = p.PrestatieCode,
                ZendingsNr = r.Zendingnummer.ToString(),
                GroepsAanvaarding = r.Identificatie
               }).Take(100);

Что переводится на:

SELECT TOP (100) [t3].[Zender], [t3].[ContactNr] AS [Contactnummer], [t3].[Identificatie], [t3].[value] AS [Uitvoerdatum], [t3].[PrestatieZendingOntvangen] AS [Ontvangen], [t3].[PrestatieAanvaard] AS [Aanvaard], [t3].[value2] AS [Foutmelding], [t3].[PrestatieCode], [t3].[value3] AS [ZendingsNr], [t3].[Identificatie2] AS [GroepsAanvaarding]

FROM (

    SELECT [t2].[Zender], [t2].[ContactNr], [t0].[Identificatie], REPLACE([t0].[Uitvoerdatum], @p0, @p1) AS [value], [t0].[PrestatieZendingOntvangen], [t0].[PrestatieAanvaard], 

        (CASE 

            WHEN (([t0].[Foutmelding] = @p2) OR ([t0].[Foutmelding] IS NULL)) AND ([t0].[PrestatieAanvaard] IS NULL) THEN CONVERT(NVarChar(3800),@p3)

            ELSE REPLACE([t0].[Foutmelding], @p4, @p5)

         END) AS [value2], [t0].[PrestatieCode], CONVERT(NVarChar,[t2].[Zendingnummer]) AS [value3], [t2].[Identificatie] AS [Identificatie2], [t2].[PrestatieOntvangen], [t0].[LastModified]

    FROM [dbo].[bam_Prestatie_AllInstances] AS [t0]

    INNER JOIN [dbo].[bam_Zending_AllRelationships] AS [t1] ON [t0].[ActivityID] = [t1].[ReferenceData]

    INNER JOIN [dbo].[bam_Zending_AllInstances] AS [t2] ON [t1].[ActivityID] = [t2].[ActivityID]

    ) AS [t3]

WHERE ([t3].[PrestatieOntvangen] >= @p6) AND ([t3].[PrestatieOntvangen] <= @p7)

ORDER BY [t3].[LastModified] DESC

Как вы можете видеть, сначала он выбирает ВСЕ, а затем берет первые 100 и делает где. Почему это? Почему он не может напрямую попасть в топ-100, я думаю, что проблема, почему мои запросы выполняются так долго, из-за этого. Есть ли лучший способ построить мой запрос linq тогда?

Спасибо

1 Ответ

0 голосов
/ 27 января 2010

Попробуйте это:

var items =  from p in ctx.bam_Prestatie_AllInstances.OrderByDesc(p => p.LastModified).Take(100) 
             join q in ctx.bam_Zending_AllRelationships on p.ActivityID equals q.ReferenceData 
             join r in ctx.bam_Zending_AllInstances on q.ActivityID equals r.ActivityID 
             where r.PrestatieOntvangen >= vanaf && r.PrestatieOntvangen <= tm 
             select new Data.BAMPrestatieInstance 
               { 
                Aanvaard = p.PrestatieAanvaard, 
                Contactnummer = r.ContactNr, 
                Identificatie = p.Identificatie, 
                Foutmelding = ((p.Foutmelding == "" || p.Foutmelding == null) && p.PrestatieAanvaard == null) ? "De prestatie is bezig met verwerkt te worden." : p.Foutmelding.Replace("\r\n", " "), 
                Ontvangen = p.PrestatieZendingOntvangen, 
                Uitvoerdatum = p.Uitvoerdatum.Replace('-', '/'), 
                Zender = r.Zender, 
                PrestatieCode = p.PrestatieCode, 
                ZendingsNr = r.Zendingnummer.ToString(), 
                GroepsAanvaarding = r.Identificatie 
               }; 

Поскольку сортировка применяется только к вашей первой таблице, я бы попытался форсировать ордер и принять 100, чтобы применить его до объединения.

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