【问题标题】:EF select from same table twiceEF 从同一张表中选择两次
【发布时间】:2023-04-05 22:28:02
【问题描述】:

我有桌子

Task
  task_id int
  name varchar

和桌子

  Event
      event_id int autoincrement
      time timestamp
      task_id int

一个任务有很多事件(创建、挂起、执行、完成等)

我想在一个查询中显示两个任务和它的最后一个事件。我想出了以下声明:

var q = context.Event
      .Include(x => x.Task)
      .Where(e => e.EventId == e.Task.Event.Max(e1 => e1.EventId))
      .Select(x => new
      {
         x.Task.Name
         x.EventId,
         x.Time,
      });

呈现给 SQL:

  SELECT t.name, e.event_id, e.time
      FROM event AS e
      INNER JOIN task AS t ON e.task_id = t.task_id
      WHERE e.event_id = (
          SELECT MAX(e0.event_id)
          FROM task.event AS e0
          WHERE t.task_id = e0.task_id)

很好,但现在我想知道是否可以对任务中的 FIRST 事件执行相同的操作。所以我需要两次加入同一张桌子并卡住

我需要 EF C# 子句来执行以下 SQL:

SELECT t.name, e1.event_id, e1.ts, e2.event_id, e2.ts
FROM event e1, event e2, task t
 WHERE t.task_id = e1.task_id
 AND e1.task_id = e2.task_id
 AND e1.event_id = (
          SELECT MIN(event_id)
          FROM event
          WHERE task_id = t.task_id)
 AND e2.event_id = (
          SELECT MAX(event_id)
          FROM event
          WHERE task_id = t.task_id)

请帮忙

【问题讨论】:

标签: c# sql entity-framework join


【解决方案1】:

如果您想检索有关每个任务及其第一个和最后一个事件的数据,Task 为其关联事件设置导航属性会有所帮助。然后你可以使用类似的东西:

var q = context.Task
  .Select(t => new
  {
     t.Name
     FirstEvent = x.Events
         .OrderBy(e => e.Time)
         .Select(e => new { e.EventId, e.Time })
         .FirstOrDefault()
     LastEvent = x.Events
         .OrderByDescending(e => e.Time)
         .Select(e => new { e.EventId, e.Time })
         .FirstOrDefault()
  });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-24
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多