Ваш код перечисляет вашу последовательность ровно один раз.Чтобы рассчитать запрошенные значения, необходимо перечислить полную последовательность.Следовательно, ни вы, ни LINQ не можете сделать это более эффективным.
Единственная эффективность, которую вы можете получить, - это заменить два оператора if одним оператором switch.Таким образом, длина свойства будет оцениваться только один раз:
switch (emp.BadgeNumber.Length)
{
case 6:
internalEmpCount++;
break;
case 13:)
contractEmpCount++;
break;
// default: do nothing
}
Или, если вы абсолютно уверены, что длина равна 6 или 13:
if (emp.BadgeNumber.Length == 6)
internalEmpCount++;
else
contractEmpCount++;
Больше эффективности: пусть ваша база данныхвыполнить подсчет
Одна из более медленных частей запроса к базе данных - это передача выбранных данных из СУБД в локальный процесс.Следовательно, разумно ограничить количество транспортируемых данных.
Если единственной причиной для вашего списка является подсчет элементов, рассмотрите возможность позволить вашей базе данных выполнять подсчет и переносить только конечный результатвместо полного списка.
IQueryable<EmpDetail> empDetails = ...
var result = empDetails
// keep only the empDetail that you want to count:
.Where(empDetail => empDetail.BadgeNumber.Length == 6
|| empDetail.BadgeNumber.Length == 13)
// make groups with same BadgeNumber.Length:
.GroupBy(empDetail => empDetail.BadgeNumber.Length,
// ResultSelector:
(length, empDetailsWithThisLength) => new
{
Length = length,
Count = empDetailsWithThisLength.Count,
});
Результат: набор из двух элементов, каждый из которых имеет [Длина, Количество].Таким образом, будет транспортировано только 4 целых числа.