2016-10-11 3 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

Try:

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); 

Мой именование это немного странно, но я надеюсь, что вы получите эту идею, в основном вы «отказались» B, когда вы сделали SelectMany(), и это должно быть так.

Непроверено, поэтому дайте мне знать, если это сработает.

См. MSDN для SelectMany() с результаты функции селектора.

+0

Спасибо, что работает! Я ценю помощь. Я взгляну на ссылку, чтобы получить upskilled. – Zeus

1

Другой подход заключается в фильтрации GreekLL внутри SelectMany с помощью this перегрузки, а затем использовать 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

Смежные вопросы