Linq 计算不同行上两个日期之间的时间间隔

Linq 计算不同行上两个日期之间的时间间隔,linq,datetime,intervals,Linq,Datetime,Intervals,我有登录和注销事件,我需要计算它们之间的时间 我想我可以将每两行(每两条消息)分组,然后进行计算,但是你会怎么做呢 我需要查询的XML示例: <Log> <Message> <DateTime>2009-12-02 14:38:41</DateTime> <Priority>Local3.Info</Priority> <Source_Host>192.168.0.100</So

我有登录和注销事件,我需要计算它们之间的时间

我想我可以将每两行(每两条消息)分组,然后进行计算,但是你会怎么做呢

我需要查询的XML示例:

<Log>
  <Message>
    <DateTime>2009-12-02 14:38:41</DateTime>
    <Priority>Local3.Info</Priority>
    <Source_Host>192.168.0.100</Source_Host>
    <MessageText>Dec  2 14:38:41 root: login,ng1,192.168.0.160,janis.veinbergs</MessageText>
  </Message>
  <Message>
    <DateTime>2009-12-02 15:28:19</DateTime>
    <Priority>Local3.Info</Priority>
    <Source_Host>192.168.0.100</Source_Host>
    <MessageText>Dec  2 15:30:33 root: logout,ng1,,janis.veinbergs</MessageText>
  </Message>
  <Message>
    <DateTime>2009-12-02 15:29:11</DateTime>
    <Priority>Local3.Info</Priority>
    <Source_Host>192.168.0.100</Source_Host>
    <MessageText>Dec  2 15:31:25 root: login,ng1,192.168.0.160,janis.veinbergs</MessageText>
  </Message>
  <Message>
    <DateTime>2009-12-02 15:58:22</DateTime>
    <Priority>Local3.Info</Priority>
    <Source_Host>192.168.0.100</Source_Host>
    <MessageText>Dec  2 16:00:37 root: logout,ng1,,janis.veinbergs</MessageText>
  </Message>
</Log>

2009-12-02 14:38:41
Local3.Info
192.168.0.100
Dec 2 14:38:41 root:login,ng1192.168.0.160,janis.veinbergs
2009-12-02 15:28:19
Local3.Info
192.168.0.100
Dec 2 15:30:33根:注销,ng1,,janis.veinbergs
2009-12-02 15:29:11
Local3.Info
192.168.0.100
Dec 2 15:31:25 root:登录,ng1192.168.0.160,janis.veinbergs
2009-12-02 15:58:22
Local3.Info
192.168.0.100
12月2日16:00:37根:注销,ng1,,janis.veinbergs

谢谢。

鉴于SQL没有任何聚合差异方法,我建议将表连接到自身,并从连接的每一侧选择您要查找的每一行

比如:

var diff = from a in db.Events
           join b in db.Events on a.SessionId equals b.SessionId
           where a.EventType == 'Login' && b.EventType == 'Logout'
           select b.EventTime - a.EventTime;
我还没有尝试过这个,但按照这些思路应该会奏效


编辑:更新以适应新提供的信息

尝试以下方法。可能会更简洁,但确实有效。为了便于阅读,我们将问题分解为几个问题

var query = from a in (from log in data.Elements()
                       select new {
                          date = DateTime.Parse(log.Element("DateTime").Value),
                          msg = log.Element("MessageText").Value
                       })
            select new {
                a.date,
                type = a.msg.Contains("login") ? "Login" : "Logout",
                user = a.msg.Substring(a.msg.LastIndexOf(',') + 1)
            };

var results = from a in query
            join b in query on a.user equals b.user
            where a.type == "Login" && b.type == "Logout"
                && b.date == (query.OrderBy(o => o.date).Where(d => d.date > a.date).FirstOrDefault().date)
            select new {
                a.user,
                Login = a.date,
                Logout = b.date             
            };

鉴于SQL没有任何聚合差异方法,我建议将表连接到自身,并从连接的每一侧选择您要查找的每一行

比如:

var diff = from a in db.Events
           join b in db.Events on a.SessionId equals b.SessionId
           where a.EventType == 'Login' && b.EventType == 'Logout'
           select b.EventTime - a.EventTime;
我还没有尝试过这个,但按照这些思路应该会奏效


编辑:更新以适应新提供的信息

尝试以下方法。可能会更简洁,但确实有效。为了便于阅读,我们将问题分解为几个问题

var query = from a in (from log in data.Elements()
                       select new {
                          date = DateTime.Parse(log.Element("DateTime").Value),
                          msg = log.Element("MessageText").Value
                       })
            select new {
                a.date,
                type = a.msg.Contains("login") ? "Login" : "Logout",
                user = a.msg.Substring(a.msg.LastIndexOf(',') + 1)
            };

var results = from a in query
            join b in query on a.user equals b.user
            where a.type == "Login" && b.type == "Logout"
                && b.date == (query.OrderBy(o => o.date).Where(d => d.date > a.date).FirstOrDefault().date)
            select new {
                a.user,
                Login = a.date,
                Logout = b.date             
            };

嗯,我也没有ID列。请参阅我的编辑,以获取我正在查询的XML示例。谢谢。代码没有直接工作(data.Elements())不会返回任何结果,但我进行了调整,使其工作的重要部分是使用查询返回“results”变量。非常感谢。嗯,我也没有ID栏。请参阅我的编辑,以获取我正在查询的XML示例。谢谢。代码没有直接工作(data.Elements())不会返回任何结果,但我进行了调整,使其工作的重要部分是使用查询返回“results”变量。非常感谢你。