如何在条件下使用实体框架组日期而不是时间日期和总和
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(),
;
换句话说,不要对日期使用函数,而是使用开始和结束日期范围进行比较。而且这里不需要分组,因为我们只有一个日期。
【讨论】:
以上是关于如何在条件下使用实体框架组日期而不是时间日期和总和的主要内容,如果未能解决你的问题,请参考以下文章