【问题标题】:How to fix and convert sql union all to linq如何修复并将 sql union all 转换为 linq
【发布时间】:2017-05-05 19:47:32
【问题描述】:

我有两张桌子:

create table A          
(
    Id              uniqueidentifier primary key not null,
    Success         int,
    Failed          int,
    CreatedOn       datetime default getdate() not null 
)
go

create table B
(
    Id              uniqueidentifier primary key not null,
    Email           varchar(150),    
    Mark            float,                       
    CreatedOn       datetime default getdate() not null
)
go


insert into A values(NEWID(), 3, 9, '2011-11-10 07:56:14.933')
insert into A values(NEWID(), 8, 3, '2011-11-30 10:56:14.933')
insert into A values(NEWID(), 2, 13, '2011-08-11 17:56:14.933')
insert into A values(NEWID(), 22, 4, '2010-12-15 21:56:14.933')

insert into B values(NEWID(),'Email 1', 9, '2011-10-10 07:56:14.933')
insert into B values(NEWID(),'Email 2', 9, '2010-10-10 07:56:14.933')
insert into B values(NEWID(),'Email 3', 9, '2009-10-10 07:56:14.933')
insert into B values(NEWID(),'Email 4', 9, '2008-10-10 07:56:14.933')

单个语句:

SELECT SUM(Success) as TotalSuccess, SUM(Failed) as TotalFailed
FROM  A
--WHERE CreatedOn = (1)
GROUP BY MONTH(CreatedOn) -- (3)

SELECT COUNT(*) as TotalEmail
FROM B
--WHERE CreatedOn = (2)
GROUP BY MONTH(CreatedOn) -- (3)  

如果你成功运行了两个单一的语句。 我有以下使用 UNION ALL 的 Transact SQL 查询来包含两个语句但错误。

SELECT  SUM(Success), SUM(Failed), TotalEmail, CreatedOn 
FROM (SELECT  Success, Failed, 0 as TotalEmail, CreatedOn
          FROM A
         --WHERE CreatedOn = (1) 
         UNION ALL
        SELECT  0 as Success, 0 as Failed, COUNT(*) as TotalEmail, CreatedOn
          FROM B
         --WHERE CreatedOn = (2) 
         ) SomeThing
GROUP BY MONTH(CreatedOn) -- (3)

(1), (2):如果用户选择所有年份,则不是 WHERE/ 可能是年 - 月/所有月 - 日/全天

(3): 如果用户选择所有年份则不是 GROUP BY/如果用户选择年份 -> 按月分组,如果用户选择月份 -> 按天分组

如何修复,这将在 LINQ 中查看,即一些示例会很好,或者如果有人可以推荐一个关于 linq 中 UNION ALL 的好教程。

编辑我已经将 LINQ 查询重写为这个并修复了我的错误:

var query = (_model.A.GroupBy(s1 => s1.CreatedOn.Month)
                        .Select(g => new  
                                {
                                    CountFailed = g.Sum(item => item.Failed),
                                    CountSuccess = g.Sum(item => item.Success),
                                    CountEmail = 0,
                                    Month = g.Key
                                }))
                .Concat(_model.B.GroupBy(s2 => s2.CreatedOn.Month)
                        .Select(myGroup => new  
                                {
                                    CountFailed = 0,
                                    CountSuccess = 0,
                                    CountEmail = myGroup.Count(),
                                    Month = myGroup.Key,
                                }));
var result = query.GroupBy(q => q.Month).Where(myGroup => myGroup.Count() > 0)
                .Select(myGroup => new  
                        {
                            CountFailed = myGroup.Sum(item => item.CountFailed),
                            CountSuccess = myGroup.Sum(item => item.CountSuccess),
                            CountEmail = myGroup.Sum(item => item.CountEmail),
                            Month = myGroup.Key
                        });

【问题讨论】:

    标签: sql linq-to-sql group-by union


    【解决方案1】:

    你可以使用Concatmethod.look How to: Concatenate Two Sequences (LINQ to SQL)

    【讨论】:

    • 我尝试如下: var result =(from s1 in _model.A group s1 by s1.CreatedOn.Month into g select new{ CountFailed = g.Sum(item => item.Failed), CountSuccess = g.Sum(item => item.Success), CountEmail = 0, Created = g.Key }) .Concat(从 s2 in _model.B group s2 by s2.CreatedOn.Month into myGroup select new { CountFailed = 0 , CountSuccess = 0, CountEmail = myGroup.Count(), Created = myGroup.Key, });但返回:两个月 10 和两个月 11 i.imgur.com/LCzRV.png 如何合并结果?
    猜你喜欢
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    • 2015-07-03
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-11
    • 2021-04-10
    相关资源
    最近更新 更多