我有两个模型类,它们提供了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; }
}
请参阅附件中的图像,以获取所需的输出内容。
希望获得积极的回应。谢谢大家!
答案 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)
};