Я думаю, проблема заключается в том, насколько сильно должны пройти данные.Для того, что вы пытаетесь сделать, я думаю, что наиболее эффективным было бы:
return db.tblUserAlerts.Count(c=>c.userID == UserID && !c.hasRead);
, потому что вы действительно обрабатываете ваши данные только одним методом, а это не копирование или преобразование ваших данных, а просто подсчетвещи, которые соответствуют предикату.
РЕДАКТИРОВАТЬ: Я снова посмотрел на ваши теги и увидел, что у вас есть linq-to-sql.Если вы используете поставщик запросов, такой как LINQ to SQL, запрос переводится.Я полагаю, что переводчик запросов linq-to-sql переводит что-то вроде:
SELECT count(c.ID) FROM tblUserAlerts WHERE c.userID == 'UserID' AND NOT c.hasRead
, в этом случае не должно быть никакой разницы в скорости, за исключением того, что LINQ-to-SQL может потребоватьсябольше работы по переводу вашего запроса, потому что в дереве выражений их больше.Эта разница в скорости будет в основном незначительной.Мой оригинальный ответ выше применим к LINQ-to-Objects.С LINQ-to-SQL, если вы не очень чувствительны к какому-либо снижению скорости (т.е. вы выполняете эту тысячу раз в узком цикле), они должны быть примерно эквивалентны.