Используя Dapper, как мне передать значения для типа SQL в качестве параметра? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь использовать dapper и передать в хранимую процедуру список целых чисел, который я определил здесь, используя DDL

CREATE TYPE [dbo].[BrandIDSet] AS TABLE ([BrandID] INT NULL);

Я создал эту хранимую процедуру:

CREATE PROCEDURE dbo.usp_getFilteredCatalogItems 
    @BrandIDSet [dbo].[BrandIDSet] READONLY

и попытка передать в коде c # значение этого параметра как

public async Task<PaginatedCatalogItemsVM> GetFilteredCatalogItems(int pageSize, int pageNumber, List<int> brandIDSet)
{
     ..
     string storedProcName = "dbo.usp_getFilteredCatalogItems";
     paginatedItemsVM.CatalogItemResults = await connection.QueryAsync<CatalogItemVM>(storedProcName, new { BrandIDSet = brandIDSet }, commandType: CommandType.StoredProcedure);

Однако, похоже, dapper не преобразует список должным образом.С помощью приведенного выше кода это приводит к выполнению следующего SQL

exec dbo.usp_getFilteredCatalogItems @BrandIDSet1=1

Что не так, поскольку BrandIDSet1 не является именем параметра.Arg.Таким образом, это приводит к

SqlException: @ BrandIDSet1 не является параметром для процедуры usp_getFilteredCatalogItems.

Как получить тип для преобразования в правильный SQL?

1 Ответ

0 голосов
/ 07 октября 2018

Вы можете передать DataTable для правильного результата.Вы можете попробовать код ниже;

var dt = new DataTable();
dt.Columns.Add(new DataColumn("BrandID", typeof(int)));
foreach (var id in brandIDSet)
{
    var row = dt.NewRow();
    row["BrandId"] = id;
    dt.Rows.Add(row);
}

string storedProcName = "dbo.usp_getFilteredCatalogItems";
paginatedItemsVM.CatalogItemResults = await connection.QueryAsync<CatalogItemVM>(storedProcName, new { BrandIDSet = dt }, commandType: CommandType.StoredProcedure);
...