Linq / Lambda复杂查询通过两个不同的字段获取结果

时间:2016-04-10 02:34:21

标签: c# entity-framework linq lambda

您好我有以下信息的表

id    StoretId  itemId  Mon   Tue   Wed  
1       1         20     33   10     5   
2       1         21     1     0     3 
3       1         20     3     2     1
4       2         21     2     1     1
5       2         20     1      1    1
6       2         21     4      4    5 

我要做的是按itemId获取每个storeId的结果和每天的项目总数,所以它看起来像这样。

StoreId 1
    itemId     Mon   Tue   Wed
      20        36    12    6
      21        1      0    3
StoreId 2
     itemId    Mon  Tue Wed
      20        1    1   1
      21        6    5   6

到目前为止,如果用户输入商店列表以获得结果,即表示

  storelist= [{storeId :1}, {storeId: 2}, {storeId: 3}]



var results= DbContext.Set<stores>()
             .Where(x=> storelist.Contains(x.storeId)
             .Select(y=> new 
                      {
                          storeId=y.storeId,
                           itemsdetails= DbContext.Set<maintable>()
                                        .Select(m=> new 
                                              {
                                                itemId=m.itemId.Distinct(),
                                                Mon=m.Mon.Sum(),
                                                Tue=m.Tue.Sum(),
                                                Wed=m.Wed.Sum()
                                              }
                       }

查询在概念上看起来很好,但它会中断并且不会给出结果。请让我知道如何修复它以获得所需的输出。 谢谢

2 个答案:

答案 0 :(得分:1)

您应该使用GroupBy按商店分组,然后按照组的总和选择列

var result = list.GroupBy(o => o.StoreId)
    .Select((o, i) => new
    {
        ID = o.ElementAt(i).ID,
        StoreId = o.Key,
        Mon = o.Sum(x => x.Mon),
        Tue = o.Sum(x => x.Tue),
        Wed = o.Sum(x => x.Wed),
    }).ToList();

答案 1 :(得分:0)

必须按StoreID和ItemID分组 并选择其他值的总和作为结果:

var result =来自列表中的项目

                      group item by new  

                     {  

                          item.StoreID,  

                          item.ItemID  

                      } into groupList  

                      select new  

                       {  

                          StoreID = groupList.Key.StoreID,  

                          ItemID = groupList.Key.ItemID,  

                          mon = groupList.Sum(i => i.mon),  

                          tue = groupList.Sum(i => i.tue),  

                          wed = groupList.Sum(i => i.wed)  

                     };