提问者:小点点

根据订单获取大多数订单产品


我是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的开头是已经订购的产品,后面是没有订购的产品,但是我需要订购的产品顺序正确(像上面期望的输出--基于它们的订单计数)。我试着编辑了。顺序是降序到

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

但这个代码不管用。你能给我一些解决这个问题的建议吗?我已经找了5个小时了。


共1个答案

匿名用户

也许您可以尝试更改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查询。