【发布时间】:2019-12-12 07:14:48
【问题描述】:
我需要在一个表上计算三个值。在纯 SQL 中,它是这样写的:
select
count (*) as num_products,
sum(case when CreatedAt > '{sql.ToSqlDate(_CreatedAfter)}' then 1 else 0 end) num_new,
sum(case when UpdatedAt > '{sql.ToSqlDate(_UpdatedAfter)}' then 1 else 0 end) num_updated
from
Products
在切换到 EF Core 时,我尝试将其转换为 Linq,就像这样
var res = (from p in _db.Products
let total = _db.Products.Count()
let NewProducts = _db.Products.Count(s => s.CreatedAt > crDate.Date)
let UpdatedProducts = _db.Products.Count(s => s.UpdatedAt > updDate.Date)
select new { total, NewProducts, UpdatedProducts } );
var response = res.ToList();
但生成的 SQL 查询似乎没有优化
SELECT
(SELECT COUNT(*) FROM [Products] AS [p0]) AS [total],
(SELECT COUNT(*) FROM [Products] AS [s]
WHERE [s].[CreatedAt] > '2019-07-31') AS [NewProducts],
(SELECT COUNT(*) FROM [Products] AS [s0]
WHERE [s0].[UpdatedAt] > '2019-07-01') AS [UpdatedProducts]
FROM
[Products] AS [p]
也许有人可以帮助将原始 SQL 查询转换为 linq?
tia 是的
【问题讨论】:
-
你为什么是来自
_db.Products.而不是p的let? -
我对 linq to sql 没有经验。你认为这里可以让 from p 并优化查询吗?如果是,我会检查。
标签: c# sql linq entity-framework-core