Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 连接2个表以检索名称和计数linq实体框架_C#_Entity Framework_Linq - Fatal编程技术网

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;
}