1

ログイン イベントとログアウト イベントがあり、それらの間の時間を計算する必要があります。

2 つの行 (2 つのメッセージごと) をグループ化して計算できると思いますが、どのように計算しますか?

クエリが必要な 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>

ありがとうございました。

4

1 に答える 1

4

SQL には集計 Diff メソッドがないため、テーブルをそれ自体に結合し、結合の両側から各行を選択することをお勧めします。

何かのようなもの:

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             
            };
于 2009-12-03T09:46:35.557 に答える