C# EF从同一个表中选择两次
我有一张桌子C# EF从同一个表中选择两次,c#,sql,entity-framework,join,C#,Sql,Entity Framework,Join,我有一张桌子 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 =&
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)
很好,但现在我想知道是否有可能对任务中的第一个事件也这样做。所以我需要加入同一个表两次,然后卡住
我需要以下SQL的EF C子句:
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)
请帮助如果要检索每个任务及其第一个和最后一个事件的数据,这将有助于该任务为其关联事件设置导航属性。然后,您可以采用以下方法:
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()
});
请看一下“let”关键字,它可能会帮助您处理此子句