2012-06-19 2 views
1

Я использую Micro ORM Dapper. Я думал, что он может обрабатывать перечисленные ниже перечисления:Я думал, что Dapper может объединить несколько запросов, подобных этому

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 })); 

Увы, это дает бесполезную ошибку. У метода запроса нет способа слить несколько результатов? Каков правильный способ сделать это?

+0

Почему вы думаете, что это законно для второго аргумента 'Query', чтобы быть последовательность? Обычно вы передаете анонимный тип, содержащий ваши аргументы, а не перечислимые. (глядя на ваш запрос, я совсем не уверен, что вы даже надеетесь, что он это сделает) –

+0

Предполагается, что «LIMIT 1» предполагает, что я ожидаю результат для каждого идентификатора в коллекции telemetryIds. – Brannon

+3

Dapper не будет писать этот запрос для вас. (dapper не изменяет ваш запрос - он не анализирует его и не манипулирует им). Вам придется писать его самостоятельно, используя предложение 'in'. –

ответ

0

Я считаю, что вы могли бы сделать это с помощью подзапросов и используя встроенный в «Список поддержки» ссылка на Dapper странице:

string sql = @"SELECT * FROM Events e WHERE TimestampTicks = 
    (SELECT MAX(TimestampTicks) FROM Events WHERE TimestampTicks <[email protected] AND TelemetryId = e.TelemetryId) 
    AND e.TelemetryId IN @TelemetryIds;" 
var events = _connection.Query<ReplayEvent>(sql, new {TelemtryIds = telemetryIds, TimestampTicks = startTime.Ticks}); 
+0

Неужели это не так, если TimestampTicks не уникален? Другими словами, мне нужно присоединиться к e.Id к Events.Id, и оператор MAX вернет идентификатор для правильной строки? – Brannon

+0

Что случилось, когда вы попытались запустить его против своего db @Brannon? Вы можете попытаться изменить подзапрос на 'SELECT Id .... ORDER BY TimestampTicks DESC LIMIT 1' и посмотреть, получится ли вам то, что вам нужно. – Edward

+0

Я закончил использовать свой первоначальный план внутри Parallel.For с клонированными соединениями для каждого потока. Тем не менее, я думаю, что этот подход работоспособен, если вам не нужна дополнительная скорость параллельных запросов. – Brannon

 Смежные вопросы

  • Нет связанных вопросов^_^