【问题标题】:EntityFramework IQueryable GroupBy multiple column and capture sumEntityFramework IQueryable GroupBy 多列并捕获总和
【发布时间】:2014-12-18 00:28:42
【问题描述】:

我正在尝试按多列分组,然后将所有记录的金额字段汇总为一条记录。

例如,我有三个库存记录,它们具有相同的位置、类型和产品。我只想返回一个库存记录(EFModel.Inventory 的一个实例),但要从所有三个记录中获得 Amount 的总和。但是,我还不想执行查询!请检查下面的代码以获得一些说明。有没有简单的方法可以做到这一点?

        IQueryable<EFModel.Inventory> query = GetInventoryView();
        if (searchParameters.GroupByLocation)
        {
            query = from inv in query
                    group inv by new { inv.LocationID, inv.LocationType, inv.ProductID }
                    into groupedInv
                    select groupedInv.First();
        }

        // Now, perform filtering, sorting, paging and etc. on the query

非常感谢!

【问题讨论】:

  • 但是 .First() 调用将执行您的查询,并且在 if 语句结束时,查询将具有实体(如果存在),否则将引发异常。
  • 是的,你是对的.. 很好!

标签: c# linq entity-framework grouping iqueryable


【解决方案1】:

你有没有考虑过这样的事情:

其中 query 是您的初始集合。

IQueryable<EFModel.Inventory> query = GetInventoryView();
 if (searchParameters.GroupByLocation)
        {

var model = query.GroupBy((group => 
                                 new { LocationID = group.LocationID, 
                                       LocationType = group.LocationType, 
                                       ProductID = group.ProductID 
                                     }
                        )
                 .Select(select => 
                 new <returning object>() { 
                     total = select.Sum(total => total.{Amount Property}), 
                     LocationID = select.Key.LocationID, 
                     ...., 
                     //other properties here  
                     }); 
  //do other stuff here 

}

这就是我做类似事情的方式。假设我已正确阅读您的问题。

任何问题让我知道。 (代码没有经过意义检查,但应该可以工作)

【讨论】:

  • var model = query.GroupBy(...
  • 库存对象有大约25个属性,有没有更简单的方法?
  • @Amir 在不编写代码的情况下,确实没有一种简单的方法可以做到这一点。但是一旦你编写了它,你就可以将代码提取出来并在类似原理的其他场景中重用它。另一种方法是在服务器上执行此操作,然后创建一个视图、存储过程或表,这些数据已经得到处理,然后您可以直接查询该表。
猜你喜欢
  • 2018-03-07
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
  • 2019-12-26
  • 2020-07-11
  • 1970-01-01
  • 2018-12-31
  • 2018-09-09
相关资源
最近更新 更多