C# 连接2个表以检索名称和计数linq实体框架
我有两个表C# 连接2个表以检索名称和计数linq实体框架,c#,entity-framework,linq,C#,Entity Framework,Linq,我有两个表Orders和Items,我正试图查询这两个表以进行统计检索 Orders有OrderID[PK]、ItemID[FK]、OrderStatus等列 Items有ItemID[PK]、ItemName、ItemPrice等列 我根据日期范围获取订单列表,然后根据订单状态返回订单数量 下面是我的统计响应。cs返回响应 public class StatisticsResponse { public int CancelledOrderCount { get; set; }
Orders
和Items
,我正试图查询这两个表以进行统计检索
有Orders
、OrderID[PK]
、ItemID[FK]
等列OrderStatus
有Items
、ItemID[PK]
、ItemName
等列ItemPrice
统计响应。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;}
}
现在,在ItemOrders
属性(类型为Dictionary
)中,我想用它们的名称和计数对每个项目进行分组。我的orders
列表中有ItemID
,我想在存储之前加入两个表以获取名称
我曾尝试使用下面的GroupBy
,但我完全被困在分组后如何获取项目名称的问题上
ItemOrders = new Dictionary<string, int>
{
orders.GroupBy(x=>x.ItemID)// Stuck here
}
ItemOrders=新字典
{
orders.GroupBy(x=>x.ItemID)//卡在这里
}
我也读过关于GroupJoin
,但不能确定它是否适合这里
有人能告诉我如何根据这两个表的
ID
加入这两个表以获得它们的名称吗?您可以使用以下内容:
using System.Entity.Data; //to use Include()
Dictionary itemOrders=dbContext.Orders.Include(o=>o.Item)
.GroupBy(o=>o.Item)
.ToDictionary(g=>g.Key.Name,g=>g.Count());
这是假设:
- 存在从订单到项目设置的导航属性
- 每个订单有一个项目
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;
}
谢谢你宝贵的时间。但由于我有自定义存储库设置,所以无法实现您的答案。我已经在下面添加了我的答案版本作为社区维基,如果有一天它可以帮助其他人的话。。
Dictionary<string,int> itemOrders = dbContext.Orders.Include(o=> o.Item)
.GroupBy(o=> o.Item)
.ToDictionary(g => g.Key.Name, g => g.Count());
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;
}