LINQ: Помощь с groupby, похоже, не работает как SQL :-) Только позволяет мне вернуть .Key и ничего больше? - PullRequest
2 голосов
/ 25 ноября 2010

У меня есть следующий запрос linq, который сгруппирован

  var results = from c in C
     join h in h on c.Code equals
        h.Code
     join m in M on c.Code equals
        m.Code
          group c by c.Code into g
            select
              new 
              {
                 Group = g.Key,
                 Total = g.Count()
              }

отлично работает, возвращает 2 записи, 1 элемент имеет в общей сложности 4 записи, а другой - в общей сложности 2. Отлично сгруппировано! но я только возвращаю сгруппированное поле ...

Существует также поле с именем tDate и для таблицы H и pCode для таблицы M.

сейчас я попытался изменить свой выбор, чтобы он был похож на, скажем, но linqpad жалуется на переменные m и h, потому что я предполагаю, что они не включены в группу ... Но это то, где я потерян .. как я могу вернуть больше поля в группе по. Конечно, и pCode, и tDate одинаковы для каждой записи в группе ... следовательно, я все равно должен получить 2 записи, но с большим количеством столбцов.

            select
              new 
              {
                 Group = g.Key,
                 Total = g.Count(),
                 PCode = m.pCode,
                 TDate = h.tDate
              }

Любое тело протянет мне руку помощи ...

Заранее спасибо

Ответы [ 4 ]

2 голосов
/ 25 ноября 2010

Я думаю, вам нужно использовать статистическую функцию, чтобы получить значение. Вы пробовали h.Max(y => y.tDate) и m.First(y => y.pCode)? Я думаю, что это может сработать, но я не уверен. Не все функции являются агрегатными функциями.

2 голосов
/ 25 ноября 2010

SQL выдаст ошибку о том, что столбцы не включены в составную функцию. Чтобы включить их, вы должны включить их в свою группу или присоединиться к данным, чтобы связать их с сгруппированными данными.

1 голос
/ 26 ноября 2010

Когда вы говорите «в», вы удаляете все переменные из области, которые были объявлены до into, и остаются только переменные, объявленные после into.

var results =
  from c in C 
  group c by c.Code into g 
  select new
  { 
    Group = g.Key, 
    Total = g.Count() 
  } into x
  from c2 in x
  join h in h on c2.Group equals h.Code 
  join m in M on c2.Group equals m.Code
  select new
  { 
    Group = x.Group, 
    Total = x.Total,
    PCode = m.pCode, 
    TDate = h.tDate
  };
0 голосов
/ 25 ноября 2010

Конечно, и pCode, и tDate одинаковы для каждой записи в группе по.

Если это так, вы можете сделать их частью ключа, чтобы получить результаты, которые выwant:

var results = 
      from c in C
      join h in H on c.Code equals h.Code
      join m in M on c.Code equals m.Code
      group c by new { cCode = c.Code, pCode = m.pCode, tDate = h.tDate } 
          into g
      select
          new
              {
                  Group = g.Key,
                  Total = g.Count()
              };

Теперь, например, вы можете сказать

var firstcCode = results.First().Group.cCode;
var firstpCode = results.First().Group.pCode;
var firsttDate = results.First().Group.tDate;

Если утверждение, которое я цитировал , не true, то, как это предлагаетсядругие ответы, как и в SQL, вам нужно вызвать агрегатную функцию, чтобы сказать, что делать с (возможно многими) pCode значениями для данного cCode.

...