Как правило: Измерьте!
Для удобства чтения я бы сказал, что гибрид 1 и 3. При такой длинной строке прямо в заголовке foreach
код становитсянемного нечитабельно, поэтому я бы поставил запрос в отдельной строке над циклом:
var stuffs = from x in getStuffs()
where x.StartDate <= DateTime.Now.AddDays(-1) &&
x.EndDate != DateTime.MinValue
select x;
или
var stuffs = getStuffs().Where(x => x.StartDate <= DateTime.Now.AddDays(-1) && x.EndDate != DateTime.MinValue);
Как вам угодно.Но после этого используйте простой цикл foreach
:
foreach (var s in stuffs) {
}
Также нет необходимости преобразовывать в список, поскольку foreach
может выполнять итерацию по любой итерируемой коллекции, включая ленивые вещи LINQ.Преобразование в список, вероятно, на самом деле стоит вашего времени.Если вам нужно, чтобы запрос был оценен за до , то цикл запускается, однако вам может потребоваться сделать это, но это не совсем обычная потребность (по моему опыту).