如何解决LINQ查询汇总和汇总数据
我有两个模型类,它们提供了sql表结构
CREATE TABLE [DBO].[TBL_PRODUCTION] ( -- class ProductionModel
PRODUCTION_ID INT IDENTITY(1,1) NOT NULL,PRODUCTION_NAME NVARCHAR(200) NOT NULL,PRODUCTION_TYPE INT NOT NULL,PRODUCTION_QUANTITY INT,CONSTRAINT PK_PRODUCTION PRIMARY KEY (PRODUCTION_ID)
)
INSERT INTO [DBO].[TBL_PRODUCTION] VALUES ('SGU',1,100)
INSERT INTO [DBO].[TBL_PRODUCTION] VALUES ('BGU',100)
INSERT INTO [DBO].[TBL_PRODUCTION] VALUES ('CCGU',2,150)
CREATE TABLE [DBO].[TBL_DISTRIBUTOR] ( class DistributorModel
DISTRIBUTOR_ID INT IDENTITY(1,PRODUCTION_ID INT NOT NULL,QUARTER_TYPE INT NOT NULL,DEMAND_QUANTITY INT,CONSTRAINT PK_DISTRIBUTOR PRIMARY KEY (DISTRIBUTOR_ID)
)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (1,555,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (1,655,3,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (2,745,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (3,10)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (2,50)
我需要按季度显示有关总分布的数据。我的意思是每个季度分配了多少总产量以及剩余的产量。我做了sql query
,但如何设计LINQ
查询。我已在SQL查询中排除了remaining quantity
,但需要在LINQ
查询中显示。
SQL查询
SELECT
A.PRODUCTION_ID,B.PRODUCTION_NAME,A.QUARTER_TYPE,B.PRODUCTION_QUANTITY,SUM(A.DEMAND_QUANTITY) [TOTAL DISTRIBUTED]
FROM [DBO].[TBL_DISTRIBUTOR] A
INNER JOIN [DBO].[TBL_PRODUCTION] B ON A.PRODUCTION_ID = B.PRODUCTION_ID
GROUP BY
A.PRODUCTION_ID,A.QUARTER_TYPE
ORDER BY A.PRODUCTION_ID
我只是在学习LINQ查询,所以不知道如何在LINQ的sql查询中表达这一点。我也有POCO班,现在该如何继续。
public class DistributorViewModels
{
public int PRODUCTION_ID { get; set; }
public string PRODUCTION_NAME { get; set; }
public int QUARTER_TYPE { get; set; }
public int PRODUCTION_QUANTITY { get; set; }
public int TOTAL_DISTRIBUTED { get; set; }
public int REMAINING_QUANTITY { get; set; }
}
请参阅附件中的图像,以获取所需的输出内容。
希望获得积极的回应。谢谢大家!
解决方法
首先有一些想法: 按生产数量分组是否有意义? 如果您已经按生产ID分组,按生产名称分组也有意义吗?
基于这些想法,我将在linq语句之后创建(开头只是所需输出的数据):
List<DISTRIBUTOR> tbl_distribution = new List<DISTRIBUTOR>(){
new DISTRIBUTOR{PRODUCTION_ID = 1,QUARTER_TYPE = 1,DEMAND_QUANTITY = 15},new DISTRIBUTOR{PRODUCTION_ID = 1,DEMAND_QUANTITY = 10},QUARTER_TYPE = 2,DEMAND_QUANTITY = 25},QUARTER_TYPE = 3,DEMAND_QUANTITY = 35},new DISTRIBUTOR{PRODUCTION_ID = 2,DEMAND_QUANTITY = 50},new DISTRIBUTOR{PRODUCTION_ID = 3,};
List<PRODUCTION> tbl_production = new List<PRODUCTION>{
new PRODUCTION{ PRODUCTION_ID = 1,PRODUCTION_NAME = "SGU",PRODUCTION_QUANTITY = 100},new PRODUCTION{ PRODUCTION_ID = 2,PRODUCTION_NAME = "BGU",new PRODUCTION{ PRODUCTION_ID = 3,PRODUCTION_NAME = "CCGU",PRODUCTION_QUANTITY = 150},};
var temp = from a in tbl_distribution
join b in tbl_production on a.PRODUCTION_ID equals b.PRODUCTION_ID
let totalProductDistributed = tbl_distribution.Where(t => t.PRODUCTION_ID == a.PRODUCTION_ID ).Sum(t => t.DEMAND_QUANTITY)
select new {
PRODUCTION_ID = a.PRODUCTION_ID,PRODUCTION_NAME = b.PRODUCTION_NAME,QUARTER_TYPE = a.QUARTER_TYPE,PRODUCTION_QUANTITY = b.PRODUCTION_QUANTITY,TOTAL_DISTRIBUTED = totalProductDistributed,REMAINING_QUANTITY = b.PRODUCTION_QUANTITY - totalProductDistributed
};
var ViewModel = from s in temp group s by new{s.PRODUCTION_ID,s.QUARTER_TYPE} into g
select g.FirstOrDefault();
但是您也可以按生产ID进行分组,并有一个季度信息表。那只是一个linq语句,您可以在一个列中达到“合并”行:
var ViewModel2 = from a in tbl_distribution group a by a.PRODUCTION_ID into g
join b in tbl_production on g.FirstOrDefault().PRODUCTION_ID equals b.PRODUCTION_ID
let quarterInfos = from c in g
group c by c.QUARTER_TYPE into d
select new
{
Quarter = d.FirstOrDefault().QUARTER_TYPE,DemandQuantity = d.Sum(t => t.DEMAND_QUANTITY),}
select new{
g.Key,b.PRODUCTION_NAME,b.PRODUCTION_QUANTITY,QuarterInfos = quarterInfos,RemainingQuantity = b.PRODUCTION_QUANTITY - quarterInfos.Sum(i => i.DemandQuantity)
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。