2017-10-16 12 views
0

Comment faire pour convertir la requête SQL suivante à LINQ?Comment convertir ce morceau de SQL en LINQ?

SELECT COUNT(*) FROM (SELECT SUM(bdi.Amount)-SUM(di.Debit -di.Credit) AS Remaining 
FROM Acc.DocItem di 
INNER JOIN (SELECT bdi.SLRef,bdi.DL,bdi.DL2,bdi.DL3,bdi.DL4,bdi.DL5,bdi.DL6,bdi.DL7,bdi.Amount,bhdr.StartDate,bhdr.EndDate FROM 
Budget.BudgetDocItem bdi INNER JOIN Budget.BudgetDocHeader bhdr ON bhdr.Id = bdi.BudgetDocHeaderRef) AS bdi 
ON 
(bdi.SLRef IS NULL AND di.SLRef IS NULL) OR bdi.SLRef = di.SLRef AND 
(bdi.DL IS NULL AND di.DL IS NULL) OR bdi.DL = di.DL AND 
(bdi.DL2 IS NULL AND di.DL2 IS NULL) OR bdi.DL2 = di.DL2 AND 
(bdi.DL3 IS NULL AND di.DL3 IS NULL) OR bdi.DL3 = di.DL3 AND 
(bdi.DL4 IS NULL AND di.DL4 IS NULL) OR bdi.DL4 = di.DL4 AND 
(bdi.DL5 IS NULL AND di.DL5 IS NULL) OR bdi.DL5 = di.DL5 AND 
(bdi.DL6 IS NULL AND di.DL6 IS NULL) OR bdi.DL6 = di.DL6 AND 
(bdi.DL7 IS NULL AND di.DL7 IS NULL) OR bdi.DL7 = di.DL7 

GROUP BY di.SLRef ,di.DL ,di.DL2 ,di.DL3 ,di.DL4 ,di.DL5 ,di.DL6 ,di.DL7,di.DocCreateDate,bdi.StartDate,bdi.EndDate,di.State 
HAVING di.State!=1 AND di.DocCreateDate BETWEEN bdi.StartDate AND bdi.EndDate 
) AS r 
WHERE r.Remaining<0 

Quand je suis en train de convertir ce morceau de SQL LINQ (cinque Linqer), j'ai reçu cette erreur:

SQL cannot be converted to LINQ: OR cannot be used in (SELECT bdi.SLRef,bdi.DL,bdi.DL2,bdi.DL3,bdi.DL4,bdi.DL5,bdi.DL6,bdi.DL7,bdi.Amount,bhdr.StartDate,bhdr.EndDate FROM Budget.BudgetDocItem bdi INNER JOIN Budget.BudgetDocHeader bhdr ON bhdr.Id = bdi.BudgetDocHeaderRef) AS bdi ON (bdi.SLRef IS NULL AND di.SLRef IS NULL) OR bdi.SLRef = di.SLRef AND (bdi.DL IS NULL AND di.DL IS NULL) OR bdi.DL = di.DL AND (bdi.DL2 IS NULL AND di.DL2 IS NULL) OR bdi.DL2 = di.DL2 AND (bdi.DL3 IS NULL AND di.DL3 IS NULL) OR bdi.DL3 = di.DL3 AND (bdi.DL4 IS NULL AND di.DL4 IS NULL) OR bdi.DL4 = di.DL4 AND (bdi.DL5 IS NULL AND di.DL5 IS NULL) OR bdi.DL5 = di.DL5 AND (bdi.DL6 IS NULL AND di.DL6 IS NULL) OR bdi.DL6 = di.DL6 AND (bdi.DL7 IS NULL AND di.DL7 IS NULL) OR bdi.DL7 = di.DL7 INNER JOIN

+2

Si vous voulez pour convertir SQL en Linq alors s'il vous plaît montrer votre tentative linq. Utiliser un outil automatisé, échouer, et juste poster une question n'est pas vraiment essayer .. –

+2

Et linq ne supporte pas 'or' dans les jointures. Il ya une question précédente sur la façon de le résoudre (j'en ai répondu moi-même) –

+0

Est-il absolument nécessaire de faire une requête Linq parce que vous pouvez utiliser DbContext avec vous aussi SQL. – Rob

Répondre

1

Essayez ce code:

from di in myContext.DocItems 
join bdi in (
    (from bdi0 in myContext.BudgetDocItems 
    join bhdr in myContext.BudgetDocHeaders on new { Id = bdi0.BudgetDocHeaderRef } equals new { Id = bhdr.Id } 
    select new { 
     bdi0.SLRef, 
     bdi0.DL, 
     bdi0.DL2, 
     bdi0.DL3, 
     bdi0.DL4, 
     bdi0.DL5, 
     bdi0.DL6, 
     bdi0.DL7, 
     bdi0.Amount, 
     bhdr.StartDate, 
     bhdr.EndDate 
    })) 
     on new { di.SLRef, di.DL, di.DL2, di.DL3, di.DL4, di.DL5, di.DL6, di.DL7 } 
    equals new { bdi.SLRef, bdi.DL, bdi.DL2, bdi.DL3, bdi.DL4, bdi.DL5, bdi.DL6, bdi.DL7 } 
group new {di, bdi} by new { 
    di.SLRef, 
    di.DL, 
    di.DL2, 
    di.DL3, 
    di.DL4, 
    di.DL5, 
    di.DL6, 
    di.DL7, 
    di.DocCreateDate, 
    bdi.StartDate, 
    bdi.EndDate, 
    di.State 
} into g 
select new { 
    Remaining = (double?)(g.Sum(p => p.bdi.Amount) - g.Sum(p => p.di.Debit - p.di.Credit)) 
} 
+0

S'il vous plaît expliquer pourquoi cela pourrait résoudre le problème et ne pas mettre le code –

+0

Merci pour vos conseils, ce code est l'équivalent SQL dans LINQ? –

+1

Non, SQL d'origine rejoindra si tous les des colonnes sont égaux. –