как сгруппировать по анонимному типу с vb.net linq для объекта - PullRequest
1 голос
/ 25 февраля 2010

Я пытаюсь написать запрос linq to object в vb.net, вот версия c # того, чего я пытаюсь достичь (я запускаю это в linqpad):

void Main()
{
 var items = GetArray(
        new {a="a",b="a",c=1}
        , new {a="a",b="a",c=2}
        , new {a="a",b="b",c=1}
    );

 (
  from i in items 
  group i by new {i.a, i.b} into g
  let p = new{ k = g, v = g.Sum((i)=>i.c)}
  where p.v > 1
  select p
 ).Dump();
}
// because vb.net doesn't support anonymous type array initializer, it will ease the translation
T[] GetArray<T>(params T[] values){
  return values;
}

Мне трудно работать с группой по синтаксису, который не совпадает (vb требуют 'идентификатор = выражение' в некоторых местах, а также с функтором суммирования с 'выражение требуется')

Большое спасибо за вашу помощь!

1 Ответ

5 голосов
/ 14 марта 2010

Вы можете создать массив типа Object в VB.NET, который может содержать объекты любого типа, включая анонимные типы. Компилятор правильно определит, что должен использоваться один и тот же анонимный тип, при условии, что вы сохраняете то же имя поля, типы и порядок полей. Я запустил этот код в LinqPad, чтобы получить результаты, которые вы ищете

 Dim items As Object() = { _
               New With {.a="a",.b="a",.c=1}, _
               New With {.a="a",.b="a",.c=2}, _
               New With {.a="a",.b="b",.c=1} _
            }
    Dim myQuery = From i In items _
             Group By i.a, i.b into g  = Group _
             let p = New With { .k = g, .v = g.Sum(Function(i) i.c)} _
          where p.v > 1 _
          select p
myQuery.Dump
...