Должен объявить скалярную переменную - Dapper - PullRequest
0 голосов
/ 16 января 2019

Я делаю многократное отображение на щупальце. Затем я пытаюсь реализовать Dapper Builder

Но оно возвращает исключение:

Must declare the scalar variable \"@ExecutionId\".\r\nInvalid usage of the option NEXT in the FETCH statement.

Без многократного сопоставления никогда не возникает проблем

Вот мой фрагмент кода

var Builder = new SqlBuilder();

var SelectedQuery = Builder.AddTemplate(@ "SELECT e.[Id], e.[BuyOrderBookId], e.[SellOrderBookId], e.[Volume], e.[Price], e.[CreationDate], e.[StatusId], bo.[UserId], bo.[MarketId], so.[UserId] FROM[dbo].[Execution] AS e JOIN[dbo].[OrderBook] AS bo ON e.BuyOrderBookId = bo.Id JOIN[dbo].[OrderBook] as so ON e.SellOrderBookId = so.Id
  /**where**/
  ORDER BY e.[CreationDate] DESC OFFSET @skip ROWS FETCH NEXT @take ROWS ONLY;
  ");

  //Execution ID
  if (filter.ExecutionId.HasValue)
   Builder.Where("e.[Id] = @ExecutionId", new {ExecutionId = filter.ExecutionId.Value
   });

  var query = await connection.QueryAsync < ExecutionViewModel, OrderBookViewModel, OrderBookViewModel, ExecutionViewModel > (SelectedQuery.RawSql, (execute, buyOrder, sellOrder) => {
    execute.BuyUserId = buyOrder.UserId;
    execute.SellUserId = sellOrder.UserId;
    execute.MarketId = buyOrder.MarketId;
    return execute;
   },    
   splitOn: "UserId,UserId",
   param: new {
    SelectedQuery.Parameters,
     skip = (pagingParam.PageNumber - 1) * pagingParam.PageSize,
     take = pagingParam.PageSize
   });

Кто-нибудь знает, я что-то здесь не так сделал?

Обновление

Я просто исправляю вот так

if (filter.ExecutionId.HasValue)
                Builder.Where(String.Format("e.[Id] = {0}",filter.ExecutionId));

Я считаю, что это не очень хороший способ реализации. Есть риск впрыска sql.

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы можете добавить такие параметры.

if (filter.ExecutionId.HasValue)
{
    Builder.Where("e.[Id] = @ExecutionId");
    ((DynamicParameters)SelectedQuery.Parameters)
        .AddDynamicParams(new {
             ExecutionId = filter.ExecutionId.Value
         });
 }
0 голосов
/ 16 января 2019

Попробуйте изменить предложение where следующим образом:

if (filter.ExecutionId.HasValue)
   Builder.Where("e.[Id]", new {Id = filter.ExecutionId.Value});
...