0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: c#, бд, yield, программирование на с#, оптимизация производительности бд</p>
1
<p>Теги: c#, бд, yield, программирование на с#, оптимизация производительности бд</p>
2
<p>Начинающие программисты при работе с коллекциями часто не придают значения<strong>оптимизации производительности</strong>(например, при работе с<strong>БД</strong>). Допустим, программист хочет реализовать функцию, возвращающую список сотрудников с оформленными ими заказами. В дальнейшем эту функцию будут использовать для отображения на внутреннем портале организации. Он делает это так:</p>
2
<p>Начинающие программисты при работе с коллекциями часто не придают значения<strong>оптимизации производительности</strong>(например, при работе с<strong>БД</strong>). Допустим, программист хочет реализовать функцию, возвращающую список сотрудников с оформленными ими заказами. В дальнейшем эту функцию будут использовать для отображения на внутреннем портале организации. Он делает это так:</p>
3
public List<Person> GetPersonsWithOrders1() { var result = new List<Person>(); foreach (var person in GetPersons()) { person.Orders = GetOrdersForPerson(person); result.Add(person); } return result; }<p>Сначала он получает из БД список сотрудников (в котором может быть 300-500 человек), и по каждому сотруднику подтягивается информация об обработанных им заказах, число которых может достигать нескольких сотен или даже тысяч.</p>
3
public List<Person> GetPersonsWithOrders1() { var result = new List<Person>(); foreach (var person in GetPersons()) { person.Orders = GetOrdersForPerson(person); result.Add(person); } return result; }<p>Сначала он получает из БД список сотрудников (в котором может быть 300-500 человек), и по каждому сотруднику подтягивается информация об обработанных им заказах, число которых может достигать нескольких сотен или даже тысяч.</p>
4
<p>Команда, работающая над порталом организации, оформила список сотрудников с постраничной навигацией. Но время получения информации при этом не уменьшилось, поскольку информация по всем сотрудникам и всем заказам запрашивается каждый раз, даже если пользователь портала открывает только первую страницу со списком сотрудников, где отображается 10 человек.</p>
4
<p>Команда, работающая над порталом организации, оформила список сотрудников с постраничной навигацией. Но время получения информации при этом не уменьшилось, поскольку информация по всем сотрудникам и всем заказам запрашивается каждый раз, даже если пользователь портала открывает только первую страницу со списком сотрудников, где отображается 10 человек.</p>
5
<p>Для решения данной проблемы достаточно немного доработать первую функцию:</p>
5
<p>Для решения данной проблемы достаточно немного доработать первую функцию:</p>
6
public IEnumerable<Person> GetPersonsWithOrders2() { foreach (var person in GetPersons()) { person.Orders = GetOrdersForPerson(person); yield return person; } }<p>Здесь мы используем неоправданно забытое многими программистами ключевое слово<strong>yield</strong>.</p>
6
public IEnumerable<Person> GetPersonsWithOrders2() { foreach (var person in GetPersons()) { person.Orders = GetOrdersForPerson(person); yield return person; } }<p>Здесь мы используем неоправданно забытое многими программистами ключевое слово<strong>yield</strong>.</p>
7
<h2>Что это даёт?</h2>
7
<h2>Что это даёт?</h2>
8
<p>Во-первых, код становится короче и удобнее для чтения.</p>
8
<p>Во-первых, код становится короче и удобнее для чтения.</p>
9
<p>Во-вторых, в случае следующего вызова метода GetPersonsWithOrders2().Take(10); список заказов запрашивается только для 10 сотрудников, которые находятся на первой странице портала, что облегчит жизнь<strong>БД</strong>!</p>
9
<p>Во-вторых, в случае следующего вызова метода GetPersonsWithOrders2().Take(10); список заказов запрашивается только для 10 сотрудников, которые находятся на первой странице портала, что облегчит жизнь<strong>БД</strong>!</p>
10
<p><em>А как вы используете yield? Пишите в комментариях!</em></p>
10
<p><em>А как вы используете yield? Пишите в комментариях!</em></p>
11
11