【问题标题】:Performing a GROUP BY query in Entity Framework from a SQL GROUP BY statement从 SQL GROUP BY 语句在实体框架中执行 GROUP BY 查询
【发布时间】:2017-06-14 10:53:09
【问题描述】:

我正在使用实体框架在 VB.NET 和 ASP.NET 中编写一个发票系统来存储我的对象。我想总结任何特定月份的所有可计费行项目,并将它们整理成发票。下面的 SQL 查询完成了这个,但是我不能让它在实体框架代码优先:

SQL 查询:

SELECT DISTINCT 
    [database].[dbo].[WorkOrderDetails].PriceCodeID,
    [database].[dbo].[WorkOrderDetails].[Description],
    SUM([database].[dbo].[WorkOrderDetails].[Quantity]) AS [Quantity],
    SUM([Subtotal]) AS Subtotal,
    SUM([Total]) AS Total
FROM 
    [database].[dbo].[WorkOrderDetails] 
INNER JOIN 
    [database].[dbo].[WorkOrders] ON [database].[dbo].[WorkOrderDetails].[WorkOrderID] = [database].[dbo].[WorkOrders].[WorkOrderID]
WHERE 
    [ClientID] = 182 
    AND [WorkOrders].[Date] >= '10/1/2016' 
    AND [WorkOrders].[Date] < '10/31/2016' 
GROUP BY 
    [PriceCodeID], [Description]

此查询的输出类似于以下内容:

PriceCodeID | Description | Quantity | Subtotal | Total  
------------+-------------+----------+----------+--------
26            BOX REFILE        19         47.50    47.50
28            BOX RETRIEVAL     15         37.50    37.50
98            Del/Pu Out       376        545.20   545.20
95            Shredding      16893        760.19   760.19

我的对象是:

  • WorkOrder:WorkOrderID、Date、ClientID (外键)、列表(WorkOrderDetail

  • WorkOrderDetail: WorkOrderDetailID、PriceCodeID (外键)、描述、单价、数量、小计、税金、总计、WorkOrderID (外键)

  • PriceCode: PriceCodeID, ShortCode, Description, UnitPrice, Tax

我正在尝试使用下面的语句,但我不确定如何使用GroupBy 语句。

newInvoice.Details = _db.WorkOrderDetails
                        .Include("WorkOrder")
                        .Where(Function(wod) wod.WorkOrder.Date >= newInvoice.StartDate And 
                                             wod.WorkOrder.Date < newInvoice.EndDate And 
                                             wod.WorkOrder.ClientID = newInvoice.ClientID)
                        .GroupBy(...)
                        .ToList()

【问题讨论】:

    标签: c# asp.net vb.net entity-framework linq


    【解决方案1】:

    您可以通过

    获得汇总结果
    Dim aggregate = From wod in _db.WorkOrderDetails
                    Where wod.WorkOrder.Date >= newInvoice.StartDate And 
                          wod.WorkOrder.Date < newInvoice.EndDate And 
                          wod.WorkOrder.ClientID = newInvoice.ClientID)
                    Group wod By Key = New With { Key wod.PriceCodeID, Key Description }
                    Into Group
                    Select agg = Key.PriceCodeID,
                                 Key.Description,
                                 Quantity = Group.Sum(Function(wod) wod.Quantity),
                                 Subtotal = Group.Sum(Function(wod) wod.Subtotal),
                                 Total = Group.Sum(Function(wod) wod.Total)
    

    您不能在此查询中直接创建新的WorkOrderDetail,因为 EF 不允许在 LINQ 查询中创建新的实体类型。但您可以使用aggregate.AsEnumerable() 继续:

    newInvoice.Details = aggregate.AsEnumerable()
                         .Select(Function (wod) New WorkOrderDetail ...)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-26
      相关资源
      最近更新 更多