Другая возможность - группировка, похожая на то, как вы можете подходить к ней в сыром SQL:
from y in context.MyTable
group y.MyCounter by y.MyField into GrpByMyField
where GrpByMyField.Key == value
select GrpByMyField.Max()
Единственное (при повторном тестировании в LINQPad) переключение на разновидность VB LINQ дает синтаксические ошибки в предложении группировки. Я уверен, что концептуальный эквивалент достаточно легко найти, я просто не знаю, как отразить его в VB.
Сгенерированный SQL будет выглядеть примерно так:
SELECT [t1].[MaxValue]
FROM (
SELECT MAX([t0].[MyCounter) AS [MaxValue], [t0].[MyField]
FROM [MyTable] AS [t0]
GROUP BY [t0].[MyField]
) AS [t1]
WHERE [t1].[MyField] = @p0
Вложенный SELECT выглядит неприглядно, как если бы запрос выполнял поиск всех строк, а затем выбирал соответствующую из полученного набора ... вопрос в том, оптимизирует ли SQL Server запрос в нечто сравнимое с применением предложения where к внутренний ВЫБРАТЬ. Я смотрю на это сейчас ...
Я не очень разбираюсь в интерпретации планов выполнения в SQL Server, но похоже, что когда предложение WHERE находится во внешнем SELECT, число фактических строк, приводящих к этому шагу, равно всем строкам таблицы, а не только соответствующие строки, когда предложение WHERE находится во внутреннем SELECT. Тем не менее, похоже, что только 1% затрат переносится на следующий шаг, когда рассматриваются все строки, и в любом случае с SQL Server возвращается только одна строка, так что, возможно, это не так уж много различий в общей схеме вещей .