我有2个表Orders
和Items
,我正在尝试查询这两个表以进行统计检索。
Orders
包含OrderID[PK]
,ItemID[FK]
,OrderStatus
等列。Items
包含ItemID[PK]
,ItemName
,ItemPrice
等列。我根据日期范围提取订单列表,然后根据状态返回计数。
以下是我的StatisticsResponse.cs
以返回回复。
public class StatisticsResponse
{
public int CancelledOrderCount { get; set; }
public int CompletedOrderCount { get; set; }
public int InProgressOrderCount { get; set; }
public int TotalOrders { get; set; }
public Dictionary<string,int> ItemOrders { get; set;}
}
这就是我在2个日期之间检索Orders
的方式。
var orders = _unitOfWork.OrderRepository
.GetMany(x => (x.OrderStatus == "Pending"
&& x.OrderDate.Value.Date >= dtStartDate
&& x.OrderDate.Value.Date < dtEndDate) ||
((x.OrderStatus == "Completed" || x.OrderStatus == "Cancelled")
&& x.DeliveryDate.Date >= dtStartDate || x.DeliveryDate.Date < dtEndDate) || (x.LastUpdated.Value.Date >= dtStartDate || x.LastUpdated.Value.Date < dtEndDate)).ToList();
if (orders != null)
{
return new StatisticsResponse()
{
TotalOrders = orders.Count(),
CancelledOrderCount = orders.Where(x => x.OrderStatus == "Cancelled").Count(),
CompletedOrderCount = orders.Where(x => x.OrderStatus == "Completed").Count(),
InProgressOrderCount = orders.Where(x => x.OrderStatus != "Completed" && x.OrderStatus != "Cancelled").Count()
}
}
现在,在ItemOrders
属性类型Dictionary<string,int>
中,我想将每个项目分组为名称和计数。我的ItemID
列表中有orders
,我希望在存储之前加入2个表来获取名称。
我尝试使用GroupBy
如下所示,但我完全坚持如何在分组后获取该项目的名称
ItemOrders = new Dictionary<string, int>
{
orders.GroupBy(x=>x.ItemID)// Stuck here
}
我也读到了GroupJoin
,但无法确定它是否适合这里。
有人可以告诉我如何根据ID
加入这两张表来获取他们的名字吗?
答案 0 :(得分:1)
您可以使用以下内容:
using System.Entity.Data; //to use Include()
...
Dictionary<string,int> itemOrders = dbContext.Orders.Include(o=> o.Item)
.GroupBy(o=> o.Item)
.ToDictionary(g => g.Key.Name, g => g.Count());
这是假设:
答案 1 :(得分:0)
所以,我通过各种在线示例GroupJoin
实现了这一点,如下所示:
if (orders != null)
{
var items = _unitOfWork.ItemRepository.GetAll();
var itemOrders = items.GroupJoin(orders,
item => item.ItemID,
ord => ord.ItemID,
(item, ordrs) => new
{
Orders = ordrs,
itemName = item.ItemName
});
StatisticsResponse statsResponse = new StatisticsResponse()
{
//...
};
foreach (var item in itemOrders)
{
statsResponse.ItemOrders.Add(item.itemName, item.Orders.Count());
}
return statsResponse;
}