Я б вважав це відповідним місцем для використання розділення команд / запитів . Наприклад:
// 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 для об'єктів, то ви не побачите жодної реальної різниці в продуктивності. Як завжди, профіліруйте свій код і виправляйте фактично вузькі місця, а не намагаючись передбачити оптимізації заздалегідь.