如何在条件下使用实体框架组日期而不是时间日期和总和

Posted

技术标签:

【中文标题】如何在条件下使用实体框架组日期而不是时间日期和总和【英文标题】:How to use Entity Framework group date not date with time and sum total where condition 【发布时间】:2021-12-26 02:09:21 【问题描述】:

我有这张桌子

CREATE TABLE Receipt
(
    id INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    idcustom INT NULL,
    idstaff INT NULL,
    payat DATETIME NOT NULL,
    totalINT NOT NULL
)

我有一个 SQL 查询:

SELECT 
    CAST(payat AS date), SUM(total)
FROM
    Receipt
WHERE
    CAST(payat AS date) = '2021-11-13'
GROUP BY 
    CAST(payat AS date)

如何在实体框架中选择这个查询?

【问题讨论】:

支点:使用payat >= '2021-11-13' AND payat < '2021-11-14' 比使用CAST(payat AS date) = '2021-11-13' 更有效。此外,您不需要GROUP BY,因为只有一个值,您同样可以将其省略并执行SELECT CAST(MIN(payat) AS date) 【参考方案1】:

应该是这样的

var result =  dbContext.Receipt
    .Select(p=> new   
            payat =  p.payat.Date,
            total =  p.total 
           )
    .GroupBy(p => p.payat )
    .Select(p => new 
        payat = p.Key,
        total = p.Sum(q => q.total)
    ).ToList();

【讨论】:

【参考方案2】:

EF 中的确切等价物是

var result =
    from r in context.Receipt
    where payat.Date = new DateTime(2013, 11, 13)
    group r by r.payat.Date into g
    select new 
        date = g.Key,
        total = g.Sum(r => r.total),
    ;

然而,一个更有效的解决方案出现了(等效的 SQL 也是如此)

var result =
    new 
        date = new DateTime(2013, 11, 13),
        total =
           (from r in context.Receipt
            where payat >= new DateTime(2013, 11, 13)
               && payat < new DateTime(2013, 11, 14)
            select r.total
           ).Sum(),
    ;

换句话说,不要对日期使用函数,而是使用开始和结束日期范围进行比较。而且这里不需要分组,因为我们只有一个日期。

【讨论】:

以上是关于如何在条件下使用实体框架组日期而不是时间日期和总和的主要内容,如果未能解决你的问题,请参考以下文章

强制实体框架使用 datetime 而非 datetime2

两个日期之间实体属性的核心数据总和

实体框架代码优先和搜索标准

如何更改实体框架为日期时间生成 SQL 精度的方式

如何在实体框架中查找具有指定日期范围列表的日期?

实体框架日期时间和 UTC