Я не уверен, что это жесткое и быстрое правило, но метод linq, который вы добавляете в Iqueryable, будет добавлен в дерево выражений linq - если только они не являются одним из методов, которые на самом деле вызывают оценку дерева (например, ToList и Single и т. Д.).
В случае LinqToSql вы узнаете, не может ли он что-то преобразовать в оператор SQL, потому что вы получите исключение времени выполнения, сообщающее, что метод не поддерживается.
например
var something = dbContext.SomeTable
.Select(c => c.col1 == "foo")
.Distinct()
.ToList()
.Count()
В приведенном выше примере Select () и Distinct () включены в SQL-запрос, передаваемый на сервер, поскольку они добавляются в Iqueryable. Count () просто действует в списке, который был возвращен SQL-запросом. Таким образом, вы не хотите делать это так: -)
В вашем случае Count () определенно будет быстрее, чем Select (), потому что результирующий оператор sql действительно будет включать счетчик, поэтому серверу нужно только вернуть одно число, а не список строк.