2011-07-14 5 views
1

"SQL Outer Apply"をLinqに変換しようとしています。 SQLは次のとおりです。Linq to SQLとouterが適用されます

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 

私は、次のLINQを試みたが、SQL文は私を与えるよう代わりに各通貨の行の1行を、持っています。

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

この問題の解決策はありますか?

+0

元クエリは簡単に左外部結合として再入力することができます。以下の質問には、少なくとも1つのlinqを扱います:http://stackoverflow.com/questions/2742814/left-outer-join-problem – Tao

答えて

0

これを試してみてください:outer applyで副選択は、複数の行を返すとき、私は、何が起こるかわからないので

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

私は、これは正しい結果を返すかどうかわからないです...

+0

「OUTER APPLY」は、 'LEFT JOIN'ではなく、それが結合されているレコードから値を受け入れることができるサブクエリの関数に依存します。 – MatBailie

+0

ダニエルありがとう。変更されたビットが変更されましたが、それがアイデアでした。 p.ProductID == PRODUCTID && p.CurrencyID == c.ID ctx.PricesにおけるPから ' {CurrencyName = c.Name、 サイン= c.Sign新しいProductPricesを選択 ActualPrice(= p.ActualPriceを選択).FirstOrDefault()、 select p.FullPrice).FirstOrDefault()?? 0 } ' – Red