【发布时间】:2016-08-04 13:06:28
【问题描述】:
我正在尝试优化一些查询,我有一个疯狂的查询。基本想法是我得到一堆房间,里面有一些相应的会议。我目前运行查询以获取所有房间,然后为每个房间我需要获取会议,在那里我对每个房间进行查询。这为大量数据库连接打开了大门(即 1000 个房间,每个房间都必须打开一个连接来拉开会议),我想改为批量进行。我正在使用 dapper 将我的查询映射到模型,并且我正在尝试使用描述的列表参数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 mife.calendar_id=@Id
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
}
);
这显然需要相当多的数据库连接,我想通过让 dapper 执行多个查询来避免这种情况,但是如果我尝试将参数添加为如下所示的列表,则会出现以下错误:
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);
我得到的错误是:
dapper 附加信息:在此上下文中不允许使用可枚举的参数序列(数组、列表等)
【问题讨论】: