2016-10-11 104 views
1

我試圖查詢一個嵌套鏈表,其中結果是子值乘以父列表中的值的乘積,然後添加結果。查詢嵌套鏈表

此代碼:

var X = (from B in Main.Globals.BookLL 
        from G in B.GreeksLL 
        where B.DealNo == 1 && B.Strategy == "Condor" && 
        G.BookOrComp == "Book" && G.GreekType == "Delta" 
        select new 
        { 
         Total = G.Data[3] * B.BookPosn * B.FxRate 
        }).Sum(s=>s.Total); 

...但我寧願使用拉姆達。下面的代碼給出了在行尾顯示的註釋的編譯錯誤。

double Z = Globals.BookLL.Where(B => B.DealNo == 1 && B.Strategy == "Condor"). 
      SelectMany(G => G.GreeksLL). 
      Where(G => G.BookOrComp == "Book" && G.GreekType == "Delta"). 
      Select(G => new { Total = G.Data[3] * B.BookPosn*B.FxRate }).   // Compile error "B does not exist in the current context" 
      Sum(); 

我不知道該怎麼做,請看看並更正查詢?謝謝。

+0

_「此代碼不能正常工作」 _ - 是無益的。 – MickyD

+0

@MickyD讀取代碼中的'// B在當前上下文中不存在'。 –

+0

我在代碼中看到顯示爲註釋的編譯錯誤。好的,我會編輯這個問題! – Zeus

回答

1

嘗試:

double Z = Globals.BookLL.Where(B => B.DealNo == 1 && B.Strategy == "Condor"). 
      SelectMany(par => par.GreeksLL, (parent, child) => new { G = child, B = parent }). 
      Where(both => both.G.BookOrComp == "Book" && both.G.GreekType == "Delta"). 
      Select(both => new { Total = both.G.Data[3] * both.B.BookPosn*both.B.FxRate }). 
      Sum(x => x.Total); 

我的命名是有點怪,但我希望你的想法,基本上你「拋棄」你這麼做的時候SelectMany() B,而這應該是這樣。

這是未經測試的,所以讓我知道它是否有效。

請參閱MSDN對於SelectMany()結果選擇器功能

+0

中的評論謝謝,這是有效的!我很感激幫助。我會看看鏈接以獲得提升。 – Zeus

1

另一種方法是過濾GreekLL使用this超載裏面的SelectMany,然後用Sum擴展:

double z = Main.Globals.BookLL.Where(book => book.DealNo == 1 && book.Strategy == "Condor") 
      .SelectMany(book => book.GreeksLL.Where(greek => greek.BookOrComp == "Book" && greek.GreekType == "Delta") 
       ,(book, greek) => new { Greek = greek, Book = book }) 
      .Sum(greekAndBook => greekAndBook.Book.BookPosn * greekAndBook.Book.Fxrate * greekAndBook.Greek.Data[3]); 
+0

謝謝,但我得到一個編譯錯誤,說當前上下文中不存在名稱'''Sum'' – Zeus

+0

@Zeus我將大括號與大括號混淆在一起,修正了它,你可以再試一次嗎? – YuvShap

+0

現在正在工作!感謝您的努力和另一種方法。 – Zeus