Похоже, что компилятор VB обрабатывает синтаксис запроса LINQ, отличный от компилятора C #.
В C # выражение
from element in list
group element by element.Value
идентично
list.GroupBy(element => element.Value)
Однако в VB
From element In list
Group element By element.Value Into g = Group
переводится в
list.GroupBy(Function(element) element.Value,
Function(key, element) New With { Key .Value = key, Key .g = element })
Я не вижу веских причин, почему компилятор VB вводит здесь анонимный тип - но это то, что он делает.
Я рекомендую всегда переводить синтаксис запроса C # LINQ (from a in list select a.Value
) в цепочку методов (list.Select(a => a.Value)
).Таким образом, компилятор VB не может вмешиваться.Вынужден использовать точную цепочку методов.
Однако ваш перевод исходного запроса неверен.
var q = from r in validationResults
from m in r.MemberNames
group r by m into g
select g;
фактически переведен в
var q = validationResults.SelectMany(r => r.MemberNames, (r, m) => new { r, m })
.GroupBy(t => t.m, t => t.r);
который в VB становится:
Dim q = validationResults.SelectMany(Function(r) r.MemberNames,
Function(r, m) New With { Key .r = r, Key .m = m }) _
.GroupBy(Function(t) t.m, Function(t) t.r)