#c#
#c#
Вопрос:
Я новичок в C # и в настоящее время пишу (и параллельно изучаю) API. Я пытался самостоятельно разобраться с проблемой, но безуспешно. Я был бы рад любому совету. У меня есть таблица заказов
{
public int OrderId { get; set; }
public DateTime DateCreated { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
public int? UserId { get; set; }
public int ProductId { get; set; }
}
и таблица продуктов
{
public int ProductID { get; set; }
public bool IsDeleted { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
public int Quantity { get; set; }
public string? ImageURL { get; set; } = string.Empty;
public int? CategoryID { get; set; }
}
Каждый заказ содержит только один продукт, его цену и название. Когда я отправляю в свой
GetProductListQuery
name: null, filter: "FavoriteOrders"
Мне нужно выполнить поиск заказов, где, например
{OrderId: 1, Name: "Juice", Price: 5, ProductId: 1, UserId: 1}
{OrderId: 2, Name: "Juice", Price: 5, ProductId: 1, UserId: 1}
{OrderId: 3, Name: "Juice", Price: 5, ProductId: 1, UserId: 1}
{OrderId: 4, Name: "Snickers", Price: 3, ProductId: 2, UserId: 1}
{OrderId: 5, Name: "Snickers", Price: 3, ProductId: 2, UserId: 1}
{OrderId: 6, Name: "Water", Price: 1, ProductId: 3, UserId: 1}
и вывод с продуктами должен быть (упрощенным): сок, Сникерс, вода, .. все остальные продукты, у которых нулевые заказы.
Мои функции сейчас выглядят так:
var orders = await _dataContext
.Entities<Order>()
.Where(x => x.UserId == 1)
.GroupBy(o => o.ProductId)
.OrderByDescending(g => g.Count())
.Select(x => x.Key)
.ToListAsync();
var products = await _dataContext
.Entities<Product>()
.OrderByDescending(x => orders.Contains(x.ProductID))
.ProjectTo<ProductDto>(_mapper.ConfigurationProvider)
.ToListAsync();
Этот код работает частично — в начале списка продуктов находятся продукты, которые были заказаны, за которыми следуют продукты, которые не были заказаны, но мне нужно, чтобы заказанные продукты были в правильном порядке (например, желаемый результат выше — на основе количества их заказов). Я попытался отредактировать .OrderByDescending к
.OrderBy(x => orders.IndexOf(x.ProducId)
но этот код не работает. Пожалуйста, не могли бы вы дать мне несколько советов, как решить эту проблему? Я искал решение 5 часов.
Ответ №1:
Может быть, вы могли бы попробовать изменить заказы.Содержит(x.ProductID) для использования Count() следующим образом:
var products = await _dataContext
.Entities<Product>()
.OrderByDescending(x => orders.Count(o => o.ProductID == x.ProductID))
.ProjectTo<ProductDto>(_mapper.ConfigurationProvider)
.ToListAsync();
Вероятно, это не лучшая производительность, которую вы можете получить. Для этого я бы предложил поиграть с запросом linq, объединяющим заказы и продукты.