LINQ查询汇总和汇总数据

时间:2020-08-23 11:18:48

标签: c# sql sql-server asp.net-mvc 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',1, 100)
INSERT INTO [DBO].[TBL_PRODUCTION] VALUES ('CCGU',2, 150)

CREATE TABLE [DBO].[TBL_DISTRIBUTOR] ( class DistributorModel
     DISTRIBUTOR_ID INT IDENTITY(1, 1) NOT NULL
    ,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,1,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (1,555,2,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (1,655,3,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (2,555,1,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (2,745,2,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (3,745,3,25)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (1,745,3,10)
INSERT INTO [DBO].[TBL_DISTRIBUTOR] VALUES (2,745,3,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  
,B.PRODUCTION_NAME
,B.PRODUCTION_QUANTITY
,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; }
}

请参阅附件中的图像,以获取所需的输出内容。

希望获得积极的回应。谢谢大家!

enter image description here

1 个答案:

答案 0 :(得分:0)

首先有一些想法: 按生产数量分组是否有意义? 如果您已经按生产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, QUARTER_TYPE = 1, DEMAND_QUANTITY = 10},
    new DISTRIBUTOR{PRODUCTION_ID = 1, QUARTER_TYPE = 2, DEMAND_QUANTITY = 25},
    new DISTRIBUTOR{PRODUCTION_ID = 1, QUARTER_TYPE = 3, DEMAND_QUANTITY = 35},
    new DISTRIBUTOR{PRODUCTION_ID = 2, QUARTER_TYPE = 1, DEMAND_QUANTITY = 25},
    new DISTRIBUTOR{PRODUCTION_ID = 2, QUARTER_TYPE = 2, DEMAND_QUANTITY = 25},
    new DISTRIBUTOR{PRODUCTION_ID = 2, QUARTER_TYPE = 3, DEMAND_QUANTITY = 50},
    new DISTRIBUTOR{PRODUCTION_ID = 3, QUARTER_TYPE = 3, DEMAND_QUANTITY = 25},
};


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", PRODUCTION_QUANTITY = 100},
    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)
            };