c#ASP.Net Core和Linq:聚合函数MIN和MAX

时间:2019-05-02 20:11:00

标签: c# linq asp.net-core

Visual Studio 2019; ASP.Net Core 2.1

我有一个数据库系统,该系统具有一个表,其中列出了各种机器上发生的事件。

// pseudo code
eventLog (
    id int primary key not null,
    eventType varchar(16) not null,
    machineName varchar(64) not null,
    loggedInUser varchar(16) not null,
    eventDate datetime not null,
)

我想检索特定机器的最早和最近的事件日期。在SSMS中,我可以获得以下信息:

SELECT
       MIN([eventDate]),
       MAX([eventDate])
FROM eventLog
WHERE UPPER(machineName) LIKE 'MY-MACHINENAME%';

在样本运行中,我得到的最小值/最大值为:

2015-08-17 10:31:47.000 / 2019-05-02 12:54:20.000

注意:machineName可以是“ mypc”之类的“简单”字符串,也可以是FQDN(“ mypc.company.com”)。我将可能的FQDN的第一个“虚线”部分分割开,并将其与已经删除了任何虚线部分的myMachine变量进行比较。

在C#中,我知道有Aggregate个方法,但是我很难遵循我发现的文档和示例并将其转化为实际实践。我到目前为止:

public class VisibleRange {
    public DateTime start { get; set; }
    public DateTime end { get; set; }
}

...

var ctx = userTrackingContext.EventLog;

usertrackingRange = (
    from eventLog in userTrackingContext.EventLog
    where eventLog.Machine.ToUpper().Split(
        '.',
        StringSplitOptions.RemoveEmptyEntries
    )[0].Trim().Equals(myMachine)
    select eventLog.Date
).Select(range => new VisibleRange {
    start = ctx.Min(a => a.Date),
    end = ctx.Max(a => a.Date)
}).First();

这可以运行,但不能为我提供有关Min值的有用结果。那已经有11年了。

8/2/2004 8:05:27 PM  /  5/2/2019 12:00:00 AM  

如何将SSMS查询转换为LINQ查询?

3 个答案:

答案 0 :(得分:2)

您可以尝试:-

        var range = new VisibleRange() { };

        var matched = userTrackingContext.EventLog.Where(a => a.MachineName.StartsWith(myMachine));

        if(matched != null)
        {
            range.start = matched.Min(a => a.EventDate);
            range.end = matched.Max(a => a.EventDate);
        }

答案 1 :(得分:0)

您可以尝试关注LINQ查询

dic_1

答案 2 :(得分:0)

我进行了一次快速的烟雾测试,您的选择对我有用。为什么不调用range.Min和range.Max从过滤后的数据集中获取结果?

import * as Highcharts from 'highcharts';
import exporting from 'highcharts/modules/exporting';
import offline from 'highcharts/modules/offline-exporting';
exporting(Highcharts);
offline(Highcharts);