加入2个表来检索名称并计算linq实体框架

时间:2017-01-14 18:45:15

标签: c# entity-framework linq

我有2个表OrdersItems,我正在尝试查询这两个表以进行统计检索。

  • Orders包含OrderID[PK]ItemID[FK]OrderStatus等列。
  • Items包含ItemID[PK]ItemNameItemPrice等列。

我根据日期范围提取订单列表,然后根据状态返回计数。

以下是我的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加入这两张表来获取他们的名字吗?

2 个答案:

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