Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 03.01.2021
Сообщений: 4
1

Как получить сумму заказов у каждого пользователя. Объединение объектов списка по критерию

16.05.2024, 22:43. Показов 626. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В БД есть списки объектов Order и User:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
modelBuilder.Entity<User>().HasData(
    new User[]
    {
        new User { Id=1, Email="user1@gmail.com", Status=UserStatus.Active},
        new User { Id=2, Email="user2@gmail.com", Status=UserStatus.Active},
        new User { Id=3, Email="user3@gmail.com", Status=UserStatus.Inactive},
        new User { Id=4, Email="user4@gmail.com", Status=UserStatus.Active},
        new User { Id=5, Email="user5@gmail.com", Status=UserStatus.Active},
        new User { Id=6, Email="user6@gmail.com", Status=UserStatus.Inactive},
        new User { Id=7, Email="user7@gmail.com", Status=UserStatus.Active},
    });
 
modelBuilder.Entity<Order>().HasData(
    new Order[]
    {
        new Order {Id=1, ProductName="Apple", Price=10, Quantity=130, UserId=1, CreatedAt=new DateTime(2003, 7, 28, 12, 0, 0), Status=OrderStatus.Created},
        new Order {Id=2, ProductName="Lemon", Price=30, Quantity=2, UserId=1, CreatedAt=new DateTime(2004, 5, 31, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=3, ProductName="Cucumber", Price=5, Quantity=10, UserId=1, CreatedAt=new DateTime(2010, 6, 1, 12, 0, 0), Status=OrderStatus.Paid},
        new Order {Id=4, ProductName="Cabbage", Price=7, Quantity=2, UserId=2, CreatedAt=new DateTime(2023, 8, 8, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=5, ProductName="Onion", Price=8, Quantity=6, UserId=2, CreatedAt=new DateTime(2019, 1, 1, 12, 0, 0), Status=OrderStatus.PaymentFailed},
        new Order {Id=6, ProductName="Carrot", Price=9, Quantity=5, UserId=2, CreatedAt=new DateTime(2020, 9, 10, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=7, ProductName="Mango", Price=40, Quantity=2, UserId=3, CreatedAt=new DateTime(2010, 11, 13, 12, 0, 0), Status=OrderStatus.PaymentFailed},
        new Order {Id=8, ProductName="Orange", Price=45, Quantity=5, UserId=4, CreatedAt=new DateTime(2003, 3, 3, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=9, ProductName="Watermelon", Price=100, Quantity=1, UserId=4, CreatedAt=new DateTime(2024, 3, 8, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=10, ProductName="Garlic", Price=8, Quantity=12, UserId=4, CreatedAt=new DateTime(2019, 5, 14, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=11, ProductName="Potato", Price=3, Quantity=100, UserId=7, CreatedAt=new DateTime(2010, 1, 1, 12, 0, 0), Status=OrderStatus.Paid},
        new Order {Id=12, ProductName="Carrot", Price=9, Quantity=15, UserId=7, CreatedAt=new DateTime(2006, 9, 1, 12, 0, 0), Status=OrderStatus.PaymentFailed},
        new Order {Id=13, ProductName="Onion", Price=8, Quantity=15, UserId=7, CreatedAt=new DateTime(2003, 5, 30, 12, 0, 0), Status=OrderStatus.Delivered},
        new Order {Id=14, ProductName="Pumpkin", Price=50, Quantity=1, UserId=7, CreatedAt=new DateTime(2021, 6, 11, 12, 0, 0), Status=OrderStatus.Paid},
        new Order {Id=15, ProductName="Watermelon", Price=100, Quantity=12, UserId=7, CreatedAt=new DateTime(2003, 12, 21, 12, 0, 0), Status=OrderStatus.Delivered},
    });
Из списка Order мне нужно получить другой список, в котором будут объекты с полями int UserId и int PriceSum(т.е. мне нужно получить сумму заказов у каждого пользователя), чтобы из него потом выбрать пользователя с максимальной суммой заказов

Я решил задачу путем сравнения полей объектов списка Order.UserId и списка User.Id в контексте БД, но мне нельзя использовать более одного запроса к БД одновременно.


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class UserService : IUserService 
{
 
  private readonly ApplicationDbContext? _context;
 
  public UserService(ApplicationDbContext? context) => _context = context;
 
  async Task<User> IUserService.GetUser()         //return a User with max total sum of orders
  {
      List<(int, int)> pricesSumByUsers = new();
  
      DateTime date = new DateTime(2003, 1, 1, 0, 0, 0);
  
      if (_context != null)
      {
          await foreach (User user in _context.Users)
          {
              int pricesSumByUser = 0;                   
              await foreach (Order order in _context.Orders)
              {
                  if (order.UserId == user.Id
                      && order.Status == OrderStatus.Delivered
                      && order.CreatedAt >= date)
                  {
                      pricesSumByUser += order.Price;
                  }
                  pricesSumByUsers.Add((pricesSumByUser, user.Id));
              }
          }
      }
 
      User userMax = new User();                  //stub
      return userMax;
}
Как это можно решить путем группировки и сортировки списка Order, или каким-то альтернативным способом?
Т.е. мне нужно получить список с объектами
{int UserId = 1, int PriceSum = 45}
{int UserId = 2, int PriceSum = 24}
и т.д.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.05.2024, 22:43
Ответы с готовыми решениями:

Для каждого сотрудника вывести сумму и количество заказов
Даны две таблицы. Заказы: КодЗаказа, СуммаЗаказа, КодСтраны, СтранаДоставки, КодСотрудника....

Получите список номеров торговых представителей, количество обработанных ими заказов, а также общую сумму этих заказов
Получите список номеров торговых представителей, количество обработанных ими заказов, а также общую...

Форму списка Заказов разбить на 4-ре списка по данным из регистра сведений (8.2, обычные формы)
Доброго времени суток, Форумчане! после решения данной задачи я сильно нагрузил систему, лагать...

Страница с формами редактирования заказов + постраничный вывод = пустышки, если кол. заказов < заказов на стр.
Добрый день. Есть у меня страничка обновления заказов с вот таким кодом &lt;? /* Соединяемся с...

3
Администратор
Эксперт .NET
17478 / 13710 / 5287
Регистрация: 17.03.2014
Сообщений: 28,148
Записей в блоге: 1
17.05.2024, 00:32 2
Лучший ответ Сообщение было отмечено toh14 как решение

Решение

toh14, вот так вроде надо
C#
1
2
3
4
5
6
7
8
9
10
11
async Task<User?> IUserService.GetUser()
{
    DateTime date = new DateTime(2003, 1, 1, 0, 0, 0);
    return await _context.Users.Select(u => new {
        User = u,
        Total = u.Orders.Where(o => o.Status == OrderStatus.Delivered && o.CreatedAt >= date).Sum(o => o.Price)
    })
    .OrderByDescending(_ => _.Total)
    .Select(_ => _.User)
    .FirstOrDefaultAsync();
}
1
1504 / 1052 / 146
Регистрация: 01.10.2009
Сообщений: 3,536
Записей в блоге: 1
17.05.2024, 10:57 3
toh14, почему у вас Id вставляется в ручную?
0
0 / 0 / 0
Регистрация: 03.01.2021
Сообщений: 4
19.05.2024, 20:39  [ТС] 4
Это тестовое задание, поэтому здесь это не требуется
К тому же, изменить по заданию это нельзя
0
19.05.2024, 20:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2024, 20:39
Помогаю со студенческими работами здесь

WooCommerce -- Как получить статистику заказов по способу оплаты?
Всем привет, Мне надо получить статистику заказов по способу оплаты, по дате и по стране. Есть...

Получить список, составленный из средних арифметических каждого списка
Дан список из k элементов, каждый из которых является списком из целых чисел. Получить список,...

Как произвести сумму значений по критерию с промежуточными результатами
Здравствуйте Гении Кода!!!! Если не сложно и есть время, помогите! Как сделать сумму в...

Где и как создать массив объектов, чтобы можно было получить доступ к методам этих объектов?
Задача: &quot;в win form кликаю на кнопку (button) и в этот момент в одном из массивов экземпляров...

Поиск пользователя по выбранному критерию
мне нужно сделать так! у меня есть выпадающий список, textbox, кнопка Если пользователь выбирает...

VBS как получить все данные пользователя windows, включая пароль, вводя имя нужного пользователя
Помогите пожалуйста, нужен код который будет выдавать пароль по имени пользователя на VBScript. В...

Как вывести список заказов, на сумму больше 100?
Всем привет. Есть три таблицы: 1. users(юзеры): поля: user_id, name. 2. products(продукты):...


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

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