我是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个小时了。
也许您可以尝试更改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查询。