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)-仍然会在我的档案器中进行查询。也可以尝试Includemeeting.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]