Вот решение, которое я придумал. Обратите внимание, что оно близко к решению, предложенному @OdeToCode (но в синтаксисе VB), с одним существенным отличием:
Dim temp = _
(From t In context.MyTable _
Group t.f1, t.f2, t.f3 By t.title Into g = Group _
Select title, g).ToList
Dim results = _
From t In temp _
Select t.title, _
f1_count = t.g.Count(Function(x) If(x.f1, False)), _
f2_count = t.g.Count(Function(x) If(x.f2, False)), _
f3_count = t.g.Count(Function(x) If(x.f3, False))
Первый запрос выполняет группировку, но ToList получает сгруппированные данные как есть с сервера. Исключение отсчета не позволяет полученному SQL-выражению генерировать под-SELECT для каждого подсчета. Я делаю подсчет во втором запросе локально.
Это работает, так как я знаю, что первый запрос вернет управляемое количество строк. Если бы он возвращал миллионы строк, мне, вероятно, пришлось бы идти в другом направлении.