Как я могу выполнить вложенное объединение, добавление и группирование в LINQ? - PullRequest
3 голосов
/ 31 октября 2008

У меня есть два объекта, давайте назовем их Input и Output

Input имеет свойства Input_ID, Label и Input_Amt
Output имеет свойства Output_ID и Output_Amt

Я хочу выполнить эквивалентный оператор SQL в LINQ:

SELECT Label, Sum(Added_Amount) as Amount FROM
    (SELECT I.Label, I.Input_Amt + ISNULL(O.Output_Amt, 0) as Added_Amount
    FROM Input I LEFT OUTER JOIN Output O ON I.Input_ID = O.Output_ID)
GROUP BY Label

Для внутреннего запроса я пишу что-то вроде:

var InnerQuery = from i in input
                 join o in output
                 on i.Input_ID equals o.Output_ID into joined
                 from leftjoin in joined.DefaultIfEmpty()
                 select new
                 {
                     Label = i.Label,
                     AddedAmount = (i.Input_Amt + leftjoin.Output_Amt)
                 };

Однако при тестировании оператор возвращает ноль. Что дает?

Кроме того, как я могу продолжить желаемый запрос и выполнить группу после того, как я добавил свои суммы вместе, в одном выражении LINQ?

Ответы [ 3 ]

5 голосов
/ 31 октября 2008

Хорошо, теперь, когда я понимаю, что происходит немного лучше, главная проблема в том, что у вас нет эквивалента бита ISNULL. Попробуйте вместо этого:

var InnerQuery = from i in input
                 join o in output
                 on i.Input_ID equals o.Output_ID into joined
                 from leftjoin in joined.DefaultIfEmpty()
                 select new
                 {
                     Label = i.Label,
                     AddedAmount = (i.Input_Amt + (leftjoin == null ? 0 : leftjoin.Output_Amt))
                 };
1 голос
/ 31 октября 2008

Какой поставщик LINQ это на самом деле использует? Вы действительно общаетесь с базой данных или просто работаете в процессе? Если вы используете LINQ to SQL, вы можете включить журнал, чтобы увидеть, какой SQL генерируется.

Я уверен, что сам InnerQuery не будет нулевым - как вы оцениваете вывод?

0 голосов
/ 02 марта 2009
var labelsAndAmounts = input
  .GroupJoin
  (
    output,
    i => i.InputId,
    o => o.OutputId,
    (i, os) => new
    {
      i,
      oAmount = os.Any() ? os.Select(o => o.OutputAmt).Sum() : 0
    }
  )
  .GroupBy(x => x.i.Label)
  .Select(g => new
    {
      Label = g.Key,
      Amount = g.Select(x => x.i.InputAmt + x.oAmount).Sum()
    }
  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...