Я бы посчитал это подходящим местом для разделения команд и запросов . Например:
// query
var validItems = items.Where(i => i.Field != null && i.State != ItemStates.Deleted);
// command
foreach (var item in validItems) {
// do stuff
}
Это также позволяет вам дать хорошее самодокументируемое имя для результата запроса. Это также помогает вам увидеть возможности для рефакторинга, потому что намного проще реорганизовать код, который только запрашивает данные или только изменяет данные, чем смешанный код, который пытается сделать оба.
При отладке вы можете сломаться раньше foreach
быстро проверить, соответствует ли содержимое validItems
тому, что вы ожидаете. Вам не нужно входить в лямбду, если вам не нужно. Если вам нужно войти в лямбду, тогда я предлагаю выделить ее в отдельную функцию, а затем пройти через это.
Есть ли разница в производительности? Если запрос поддерживается базой данных, то версия LINQ потенциально может выполняться быстрее, поскольку запрос SQL может быть более эффективным. Если это LINQ to Objects, то вы не увидите никакой реальной разницы в производительности. Как всегда, профилируйте свой код и исправьте узкие места, о которых действительно сообщается, вместо того, чтобы пытаться предсказать оптимизацию заранее.