【发布时间】:2021-12-23 16:59:01
【问题描述】:
SQL:
SELECT
monitors.monitor_name,
alltime = ISNULL(SUM(count), 0),
today = ISNULL(SUM(CASE WHEN time_stamp >= CAST(CAST(GETUTCDATE() AS date) AS datetime)
AND time_stamp < CAST(DATEADD(day, 1, CAST(GETUTCDATE() AS date)) AS datetime)
THEN count END), 0),
current_hour = ISNULL(SUM(CASE WHEN time_stamp >= DATEADD(hour, DATEDIFF(hour, '20000101', GETUTCDATE()), '20000101')
AND time_stamp < DATEADD(hour, DATEDIFF(hour, '20000101', GETUTCDATE()) + 1, '20000101')
THEN count END), 0)
FROM CollectorOptions monitors
JOIN CollectorCounters counters ON counters.monitor_name= monitors.monitor_name
WHERE monitors.is_active = 1
GROUP BY
monitors.monitor_name;
C# 对象:
监控:
class Monitor {
public string monitor_name{ get; set;}
public bool is_active {get;set;}
}
和
计数器:
public class Counter{
public string monitor_name { get; set;}
public DateTimeOffset time_stamp { get; set;}
public int count { get; set;}
}
而我需要把它变成的对象是:
所有统计数据:
[Keyless]
public class AllStatistics{
public string monitor_name {get;set;}
public int alltime {get;set;}
public int today {get;set;}
public int current_hour {get;set;}
}
我没有太多使用 LINQ 的经验,所以我用它取得的最大成就是:
var list = (from MyDbContext.Monitors
select monitor_name).Where(monitor => monitor.is_active != 0).ToList();
我的问题是,如何编写具有与上述 SQL 查询相同功能的 LINQ 语句?
【问题讨论】:
-
我觉得使用 EF 扩展(我习惯于 EF 核心,不确定您使用的是什么 EF)可以使用 dateadd 函数:docs.microsoft.com/en-us/ef/core/providers/sql-server/… 但是我只使用无键实体这是因为查询似乎足够复杂
-
我也在使用 EF Core,我已经用 [Keyless] 注释更新了类。