我试图优化一些查询,而且我有这个疯狂的问题。基本的想法是我得到一堆有相应会议的房间。我目前正在运行一个查询来获取所有房间,然后在每个房间我需要召开会议,在那里为每个房间进行查询。这为大量的数据库连接(即每个1000个房间都必须打开一个连接来召开会议)打开了一扇门,而且我希望以批处理的方式进行操作。我使用短小精悍的映射我的查询模式,我尝试使用列表参数描述here小巧的批量查询而不是多次执行的单个查询
SELECT
mm.id,
mm.organizer_name as Organizer,
mm.subject as Subject,
mm.start_time as StartTime,
mm.end_time as EndTime,
(mm.deleted_at IS NOT NULL) as WasCancelled,
(am.interactive = 0 AND am.cancelled_at IS NOT NULL) as WasNoShow,
c.name as name
FROM master_meeting mm
LEFT JOIN master_meeting__exchange mme ON mme.id=mm.id
LEFT JOIN master_meeting__forwarded_exchange mmfe ON mmfe.id=mm.id
LEFT JOIN meeting_instance__exchange mie ON mie.meeting_id=mm.id
LEFT JOIN meeting_instance__forwarded_exchange mife ON mife.meeting_id=mm.id
LEFT JOIN appointment_meta__exchange ame ON mie.item_id=ame.item_id
LEFT JOIN appointment_meta__exchange ame2 ON mife.item_id=ame2.item_id
LEFT JOIN appointment_meta am ON am.id=ame.id
LEFT JOIN appointment_meta am2 ON am2.id=ame2.id
LEFT JOIN calendar c on mie.calendar_id=c.id
WHERE mie.calendar_id = @Id OR [email protected]
AND mm.start_time BETWEEN @StartTime AND @EndTime
没有进入疯狂的长连接序列的详细情况,我目前要做的这个查询,一很多。它已被写入了最初为:
List<Result> resultSet = new List<Result>();
foreach(int id in idList){
resultSet.AddRange(
_queryHandler.Handle(
new MeetingQuery(id, "FixedStartTime", "FixedEndTime")
)
);
}
这反过来这一堆次调用并运行查询:
_connection.Query<Meeting>(sql,
new {
Id = query.id,
StartTime = query.StartTime,
EndTime = query.EndTime
}
);
这显然需要相当多的数据库连接,我想通过具有短小精悍做多个查询,以避免这种情况,但我得到了下面的错误,如果我尝试添加参数为它看起来像这样的列表:
class Parameters {
int Id;
string StartTime;
string EndTime;
}
List<Parameters> parameters = new List<Parameters>();
foreach(int id in idList)
parameters.Add(new Parameters(id, "SameStartTime", "SameEndTime");
然后我会使用的参数列表作为这样的:
_connection.Query<Meeting>(sql,parameters);
我得到的错误是:
短小精悍的其他信息:参数可枚举序列(数组,列表等)没有在这方面允许