C# 如何将两个LINQ查询合并为一个查询?

C# 如何将两个LINQ查询合并为一个查询?,c#,sql,entity-framework,linq,C#,Sql,Entity Framework,Linq,我有以下SQL查询: select [Event2].EventType AS 'Event type', SUM (1) AS 'Number of events', AVG(DATEDIFF(Second, [Event1].CreationDate, [Event2].CreationDate)) AS 'Time' from [Event] as [Event1] join [Event] as [Event2] on [Event1]

我有以下SQL查询:

select 
    [Event2].EventType AS 'Event type', 
    SUM (1)            AS 'Number of events', 
    AVG(DATEDIFF(Second, [Event1].CreationDate, [Event2].CreationDate)) AS 'Time'
from [Event] as [Event1]
join [Event] as [Event2] on [Event1].Id = [Event2].ParentId
group by [Event2].EventTypeId;
为此,我找到了两个LINQ查询

// This query brings the event types and the differences between the events.
var rows = from event1 in _eventRepository.AsQueryable()
           join event2 in _eventRepository.AsQueryable() on event1.Id equals event2.ParentId
           select new 
           {
               EventId = event2.EventId, 
               TimeInSeconds = DbFunctions.DiffSeconds(event1.CreationDate, event2.CreationDate) 
           };

// This query groups the rows before by Event type.
var groups = (from item in rows  
              group item by item.EventTypeId into g
              select new EventModel
              {
                  EventTypeId = g.Key,
                  NumberOfEvents = g.Sum(x => 1),
                  Time = (int) g.Average(x => x.TimeInSeconds)
              }).ToList();
我必须将这些查询合并成一个查询。
结果必须包含三个元素:
事件类型
事件数
第一个事件的创建日期和第二个事件的创建日期之间经过的时间的平均值。

您只需将分组语句添加到第一个查询(而不是select):


您也不能在分组中指定字段,而只能在select语句中指定字段,但将其保留为原始字段

为什么必须将其合并为一个字段?因为事件表在某个时间可能包含很多行,并且有太多的数据带入内存。@PianoSong-直到
ToList()
是什么让您认为第一个查询会将任何内容带入@PianoSong的内存?我建议试一试。您可能会惊讶地看到哪些行实际上导致执行SQL。
var result = (from event1 in _eventRepository
              join event2 in _eventRepository on event1.Id equals event2.ParentId

              group new {
                EventId =  event2.EventId,
                TimeInSeconds = DbFunctions.DiffSeconds(event1.CreationDate, event2.CreationDate)
              }
              by event2.EventTypeId into g

              select new EventModel {
                EventTypeId = g.Key,
                NumberOfEvents = g.Count(),
                Time = (int) g.Average(x => x.TimeInSeconds)
              }).ToList();