С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
1

IAsyncEnumerable или IEnumerable

21.03.2017, 13:00. Показов 3672. Ответов 9

Author24 — интернет-сервис помощи студентам
Есть метод:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        [HttpPost]
        public async Task<IActionResult> GetPay(int?[] quantity)
        {
            if (!quantity.All(q => q == null))
            {
                IAsyncEnumerable<Money> purse = (await _db.PurseSet.Include(p => p.Money)
                                                           .AsNoTracking()
                                                           .ToListAsync())
                    .SelectMany(p => p.Money)
                    .Where(p => p.PurseId == 2)
                    .ToAsyncEnumerable();
 
                (await purse.ToList())
                    .ForEach(m=>m.Quantity = 30);
 
                _db.MoneySet.UpdateRange(await purse.ToList());
                await _db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
 
            return NotFound();
        }
Стоит-ли использовать IAsyncEnumerable или можно обойтись IEnumerable:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        [HttpPost]
        public async Task<IActionResult> GetPay(int?[] quantity)
        {
            if (!quantity.All(q => q == null))
            {
                IEnumerable<Money> purse = (await _db.PurseSet.Include(p => p.Money).AsNoTracking().ToListAsync())
                    .SelectMany(p => p.Money)
                    .Where(p => p.PurseId == 2);
 
                purse.ToList().ForEach(m=>m.Quantity = 10);
 
                _db.MoneySet.UpdateRange(purse);
                await _db.SaveChangesAsync();
                return RedirectToAction("Index");
            }
 
            return NotFound();
        }
В итоге, в первом случае у меня два purse.ToList(), во втором один purse.ToList()
Обращение к бд, вроде как будет одно, но в случае с await purse.ToList() я два раза буду использовать локальный запрос IAsyncEnumerable?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.03.2017, 13:00
Ответы с готовыми решениями:

Проверить корректность реализации IEnumerable<T> и IEnumerable
Гуру, выручайте! Разбираюсь в создании обобщенной коллекции и запутался в том, как реализовать...

Метод, преобразующий многомерные или ступенчатые массивы в IEnumerable
меня все мучает идея, как преобразовать массив любой размерности в последовательность. Не покидает...

Зачем IEnumerable наследоваться от IEnumerable<T>?
/* * Created by SharpDevelop. * User: Admin * Date: 07.09.2018 * Time: 17:26 * * To...

IEnumerable<T>, IQueryable<T> когда лучше использовать тот или иной тип коллекций
IEnumerable&lt;T&gt;, IQueryable&lt;T&gt; когда лучше использовать тот или иной тип коллекций?

9
Эксперт .NET
17792 / 12943 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
21.03.2017, 13:15 2
Поскольку работа со списком не является блокирующей операцией, я бы предпочел делать один асинхронный запрос в базу, а список обрабатывать как обычно, то есть второй вариант.
Только не совсем понятно: почему вы сначала тянете все записи из базы, а потом уже фильтруете их на стороне клиента? Не разумнее ли было бы фильтровать их тоже на стороне базы?
C#
1
2
3
4
5
IEnumerable<Money> purse = (await _db.PurseSet.Include(p => p.Money)
                    .SelectMany(p => p.Money)
                    .Where(p => p.PurseId == 2)
                    .AsNoTracking()
                    .ToListAsync());
Добавлено через 6 минут
При повторном взгляде возникает еще вопрос: если из базы тянутся только Money, которые фильтруются по определенному ключу кошелька, то зачем тянуть данные из кошелька, если можно сразу тянуть деньги?
C#
1
2
3
4
IEnumerable<Money> purse = (await _db.MoneySet
                    .Where(p => p.PurseId == 2)
                    .AsNoTracking()
                    .ToListAsync());
1
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
21.03.2017, 13:15  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Не разумнее ли было бы фильтровать их тоже на стороне базы?
Ну да, тянуть всю _db.PurseSet.Include(p => p.Money), не разумно, и не нужно...
0
14 / 13 / 1
Регистрация: 25.01.2023
Сообщений: 426
15.03.2023, 19:35 4
kolorotur, здравствуйте. Объясните мне один момент, связанный с нововведением в C# 8 - IAsyncEnumerable. Почему при таком коде UI поток не блокируется
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await foreach (var symb in GetCharsAsync())
    {
        list.Items.Add(symb);
    }
}
 
private async IAsyncEnumerable<char> GetCharsAsync()
{
    foreach (char symb in "123456789")
    {
        yield return symb;
        await Task.Delay(1000);
    }
}
А при таком - блокируется
C#
1
2
3
4
5
6
7
8
9
private async void Button_Click(object sender, RoutedEventArgs e)
{
    using var ctx = await Task.Run(() => new Context());
 
    await foreach (var user in ctx.Users)
    {
        list.Items.Add(user.Name);
    }
}
Проверял этот код в wpf
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,405
15.03.2023, 20:05 5
Цитата Сообщение от INexteR Посмотреть сообщение
await foreach (var user in ctx.Users)
    {
        list.Items.Add(user.Name);
    }
а это точно асинхронно делается?
0
14 / 13 / 1
Регистрация: 25.01.2023
Сообщений: 426
15.03.2023, 20:47 6
Цитата Сообщение от Dr9vik Посмотреть сообщение
а это точно асинхронно делается?
Ааа, вот в чем дело. А почему так? Зачем тогда в классе DbSet наличествует метод GetAsyncEnumerator<>?

Добавлено через 29 минут
Если что, для EF используется поставщик SQLite. Но то же самое было и с другими, такими как ms sql server, MySQL
0
Эксперт .NET
17792 / 12943 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
15.03.2023, 20:52 7
Цитата Сообщение от INexteR Посмотреть сообщение
А при таком - блокируется
А если повторно на кнопку ткнуть, то снова блокируется?
0
14 / 13 / 1
Регистрация: 25.01.2023
Сообщений: 426
15.03.2023, 21:05 8
Цитата Сообщение от kolorotur Посмотреть сообщение
то снова блокируется?
Нет, после этого уже не происходит
0
403 / 265 / 69
Регистрация: 12.04.2020
Сообщений: 1,405
15.03.2023, 21:06 9
Цитата Сообщение от INexteR Посмотреть сообщение
EF используется поставщик SQLite
эта база не работает асинхронно
0
14 / 13 / 1
Регистрация: 25.01.2023
Сообщений: 426
15.03.2023, 21:21 10
Цитата Сообщение от Dr9vik Посмотреть сообщение
эта база не работает асинхронно
Да, спасибо, уже понял. Посмотрел документацию
0
15.03.2023, 21:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.03.2023, 21:21
Помогаю со студенческими работами здесь

Сделать преобразование из string в IEnumerable<XElement>, или как в IEnumerable<XElement> формировать команду?
такая команда работает var v=...

Цикл foreach, проход по IEnumerable и IEnumerable.ToList()
Здравствйте, уважаемые форумчане, вопрос по реализации цикла foreach. Два куска кода: ...

Передача массива или Ienumerable из представления в контроллер
Всем привет ! Поделитесь как то делает , есть представление , с него аяксом уходят данные, на...

Ошибка при использовании IEnumerable<T>: Использование универсального типа IEnumerable требует аргумент типа 1
Доброго Вам времени суток. Помогите решить следующую задачку. На строке IEnumerable&lt;Device&gt; =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru