根据订单获取最多订购的产品

时间:2020-12-22 14:38:57

标签: 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();

此代码部分有效 - ProductList 的开头是已订购的产品,然后是尚未订购的产品,但我需要订购的产品按正确顺序排列(如上面所需的输出 - 基于他们的订单数)。我试图将 .OrderByDescending 编辑为

.OrderBy(x => orders.IndexOf(x.ProducId)

但是此代码不起作用。请你能给我一些如何解决这个问题的建议吗?我一直在寻找解决方案 5 个小时。

1 个答案:

答案 0 :(得分:0)

也许您可以尝试更改 orders.Contains(x.ProductID) 以使用 Count(),如下所示:

var products = await _dataContext
            .Entities<Product>()
            .OrderByDescending(x => orders.Count(o => o.ProductID == x.ProductID))
            .ProjectTo<ProductDto>(_mapper.ConfigurationProvider)
            .ToListAsync();

这可能不是您能获得的最佳性能。为此,我建议尝试使用 linq query 加入订单和产品。