C# EF查询创建大量子查询

C# EF查询创建大量子查询,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我有以下数据结构: 会议有一对多的会议室 会议室有一对多的会议 这些数据通过联接表进行关联: public class MeetingRoomMeeting : Entity { public Guid MeetingRoomId { get; set; } public virtual MeetingRoom MeetingRoom { get; set; } public Guid MeetingId { get; set; }

我有以下数据结构:

会议
有一对多的
会议室

会议室
有一对多的
会议

这些数据通过联接表进行关联:

public class MeetingRoomMeeting : Entity
    {
        public Guid MeetingRoomId { get; set; }
        public virtual MeetingRoom MeetingRoom { get; set; }

        public Guid MeetingId { get; set; }
        public virtual Meeting Meeting { get; set; }
    }
会议也有与会者,其定义如下:

一次
会议
有一对多的
与会者

与会者
有1个
会议

我有两个问题:

获取
会议室的所有
会议
,以及

获取
会议室中所有
会议的平均
与会者

查询执行时间的差异大约为100-200秒(仅获取一个房间的会议),以及约30-50秒(获取与会者)

查询如下:

这将返回会议列表(用于进一步聚合和转换)。它是在一组日期之间为特定房间(由其Guid定义)举行的会议

var meetings = _reader.Query()
               .Where(room => room.Id == query.Id)
               .Include(room => room.Meetings)
                   .ThenInclude(meeting => meeting.Meeting)
               .Select(room => new Models.MeetingRoom
               {
               Id = room.Id,
               Name = room.Name,
               Location    = room.Location,
               Meetings = room.Meetings.Where(meeting => meeting.Meeting.StartTime >= query.StartTime && meeting.Meeting.EndTime <= query.EndTime).Select(meeting => new MeetingRoomMeeting
                   {
                       MeetingId = meeting.MeetingId,
                       Meeting = meeting.Meeting
                   }).ToList()
               })
           .FirstOrDefault();
然后是一吨这些:

SELECT [a].[Id], [a].[Internal], [a].[MeetingId], [a].[PersonId], [a].[Rating], [a].[WasOrganizer]
FROM [Attendee] AS [a]

我确信我在构造LINQ查询时做了一些非常不允许的事情。我考虑在与会者上添加MeetingRoom.Id,以便能够使用
MeetingRoom.Id内部加入Attendee.MeetingRoom\u Id

尝试包含
meeting.meeting.Attenders
。看来你的atendees是懒散加载的。不幸的是,它似乎不起作用。尝试了.Include(room=>room.Meetings)。然后尝试了Include(meeting=>meting.meeting.attendes)和[…]。然后尝试了Include(meeting=>meeting.Meetings)。然后尝试了Include(meeting=>meeting.attendes)-仍然会在我的档案器中进行查询。也可以尝试Include
meeting.meeting.attendes
。看来你的atendees是懒散加载的。不幸的是,它似乎不起作用。尝试了.Include(room=>room.Meetings)。然后Include(meeting=>meting.meeting.attendes)和[…]。然后Include(meeting=>meeting.meeting)。然后Include(meeting=>meeting.attendes)-仍然在我的档案器中进行查询。
    var meetings = _reader.Query()
                .Where(room => room.Id == query.Id)
                .Include(room => room.Meetings)
                    .ThenInclude(meeting => meeting.Meeting)
                .Select(room => new Models.MeetingRoom
                {
                    Id = room.Id,
                    Name = room.Name,
                    Location = room.Location,
                    Meetings = room.Meetings.Where(meeting => meeting.Meeting.StartTime >= query.StartTime && meeting.Meeting.EndTime <= query.EndTime).Select(meeting => new MeetingRoomMeeting
                    {
                        MeetingId = meeting.MeetingId,
                        Meeting = new Models.Meeting
                        {
                            StartTime = meeting.Meeting.StartTime,
                            Attendees = meeting.Meeting.Attendees
                        } 
                    }).ToList()
                })
                .FirstOrDefault();
N'SELECT [meeting].[MeetingRoomId], [meeting].[MeetingId], [meeting.Meeting].[StartTime], [meeting.Meeting0].[Id]
FROM [MeetingRoomMeeting] AS [meeting]
INNER JOIN [Meeting] AS [meeting.Meeting] ON [meeting].[MeetingId] = [meeting.Meeting].[Id]
INNER JOIN [Meeting] AS [meeting.Meeting0] ON [meeting].[MeetingId] = [meeting.Meeting0].[Id]
WHERE ([meeting.Meeting].[StartTime] >= @__query_StartTime_1) AND ([meeting.Meeting].[EndTime] <= @__query_EndTime_2)',N'@__query_StartTime_1 datetime2(7),@__query_EndTime_2 datetime2(7)',@__query_StartTime_1='2016-10-02 22:00:00',@__query_EndTime_2='2016-11-03 22:59:59'
SELECT [a].[Id], [a].[Internal], [a].[MeetingId], [a].[PersonId], [a].[Rating], [a].[WasOrganizer]
FROM [Attendee] AS [a]