首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从SQL GROUP语句中执行实体框架中的组查询

从SQL GROUP语句中执行实体框架中的组查询
EN

Stack Overflow用户
提问于 2017-01-29 00:12:56
回答 1查看 1.3K关注 0票数 0

我正在用VB.NET和ASP.NET编写一个发票系统,使用实体框架来存储我的对象。我想总结所有的帐单线项目的任何一个具体的月份,并将它们整理成发票。下面的SQL查询实现了这一点,但是我无法让它在实体框架代码中工作-首先:

SQL查询:

代码语言:javascript
复制
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]

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

代码语言:javascript
复制
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 (外键),List ( WorkOrderDetail)
  • WorkOrderDetail:WorkOrderDetailID,PriceCodeID (外键),描述,UnitPrice,数量,小计,税收,总计,WorkOrderID (外键)
  • PriceCode:PriceCodeID,ShortCode,Description,UnitPrice,Tax

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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

发布于 2017-01-29 10:41:13

您可以通过以下方法获得聚合结果

代码语言:javascript
复制
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()继续:

代码语言:javascript
复制
newInvoice.Details = aggregate.AsEnumerable()
                     .Select(Function (wod) New WorkOrderDetail ...)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41916310

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档