2011-07-14 3 views
1

Je suis en train de convertir "SQL Outer Apply" à Linq. Le SQL est:Linq to SQL et application externe

select Currencies.Name, Currencies.Sign ,a.ActualPrice 
from Currencies 
outer apply (select CurrencyID,ActualPrice from Prices 
where ProductID=5 and  Currencies.ID=Prices.CurrencyID)a 

J'ai essayé la Linq suivante, mais a obtenu une ligne, au lieu de la ligne pour chaque devise que l'instruction SQL me donne.

from c in Currencies 
from p in Prices.DefaultIfEmpty() 
where p.ProductID.Equals(5) && c.ID==p.CurrencyID 
select new {c.Name, p.ActualPrice} 

Toute solution pour cela?

+0

original requête pourrait facilement être reqritten comme une jointure externe gauche, et la question suivante couvre au moins un équivalent linq: http://stackoverflow.com/questions/2742814/left-outer-join-problem – Tao

Répondre

0

Essayez ceci:

var result = 
    Currencies.Select(c => new 
         { 
          Name = c.Name, 
          Sign = c.Sign, 
          ActualPrice = Prices.Where(p => p.ProductID == 5 && 
                  p.CurrencyID == c.ID) 
               .FirstOrDefault() 
         }); 

Je ne sais pas si cela renvoie le résultat correct, parce que je ne sais pas ce qui se passe, lorsque la sous-requête en outer apply retourne plusieurs lignes ...

+0

'EXTER APPLY' est équivalent à un 'LEFT JOIN', mais sur une fonction de sous-requête capable d'accepter les valeurs des enregistrements auxquels elle est connectée. – MatBailie

+0

Merci Daniel. un peu recodé a changé mais c'était l'idée. ' sélectionner de nouveaux ProductPrices { CurrencyName = c.Name, signe = c.sign, ActualPrice = (de p dans ctx.Prices où p.ProductID == productId && p.CurrencyID == c.ID sélectionnez p.ActualPrice). FirstOrDefault(), sélectionnez p.FullPrice) .FirstOrDefault() ?? 0 } ' – Red