C# 我认为Dapper可以像这样合并多个查询

C# 我认为Dapper可以像这样合并多个查询,c#,sqlite,dapper,C#,Sqlite,Dapper,我用的是精巧的微型ORM。我认为它可以处理如下枚举: string sql = @"SELECT * FROM Events WHERE TimestampTicks <= @TimestampTicks AND TelemetryId = @TelemetryId ORDER BY TimestampTicks DESC LIMIT 1"; var events = _connection.Query<ReplayEvent>(sql, telemetryIds.Select

我用的是精巧的微型ORM。我认为它可以处理如下枚举:

string sql = @"SELECT * FROM Events WHERE TimestampTicks <= @TimestampTicks AND TelemetryId = @TelemetryId ORDER BY TimestampTicks DESC LIMIT 1";
var events = _connection.Query<ReplayEvent>(sql, telemetryIds.Select(ti => new { TimestampTicks = startTime.Ticks, TelemetryId = ti }));

唉,这是一个毫无价值的错误。查询方法没有合并多个结果的方法吗?正确的方法是什么?

我相信您可以使用子查询和页面上引用的内置“列表支持”来实现这一点:


为什么你认为第二个参数是一个序列是合法的?通常,传入包含参数的匿名类型,而不是可枚举类型。查看您的查询,我根本不确定您希望它会是什么。限制1应该意味着我希望遥测id集合中的每个id都有一个结果。Dapper不会为您编写该查询。dapper不会修改您的查询-它不会解析和操作查询。您必须使用in子句自己编写查询。我不希望dapper更改查询。我希望它可以并行执行多次查询并合并结果。如果timestacks不是唯一的,这会失败吗?换句话说,我是否需要将e.Id加入Events.Id,MAX操作符是否返回正确行的Id?当您尝试对db@Brannon运行它时发生了什么?您可以尝试更改子查询以选择Id。。。。按时间戳排序DESC LIMIT 1,看看这是否满足您的需要。我最终在并行程序中使用了我的原始计划。对于,每个线程都有克隆的连接。然而,如果您不需要额外的并行查询速度,我认为这种方法是可行的。
string sql = @"SELECT * FROM Events e WHERE TimestampTicks = 
    (SELECT MAX(TimestampTicks) FROM Events WHERE TimestampTicks <=@TimestampTicks AND TelemetryId = e.TelemetryId ) 
    AND e.TelemetryId IN @TelemetryIds;"
var events = _connection.Query<ReplayEvent>(sql, new {TelemtryIds = telemetryIds, TimestampTicks = startTime.Ticks});