使用Dapper,如何将sql类型的值作为参数传递?

时间:2018-10-06 21:04:37

标签: asp.net sql-server asp.net-core dapper

我正在尝试使用dapper并将我在这里使用DDL定义的整数列表传递到存储过程中

  public DbSet<Supplier> Suppliers { get; set; }
  public DbSet<Consumer> Consumers { get; set; }
  public DbSet<Person>  People { get; set; }

我已经创建了这个存储过程:

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

并尝试以C#代码传递该参数的值

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

但是,dapper似乎并没有按预期方式转换列表。使用上面的代码,将导致以下SQL被执行

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

这不正确,因为BrandIDSet1不是参数的名称。精氨酸 因此,它会导致

  

SqlException:@ BrandIDSet1不是过程usp_getFilteredCatalogItems的参数。

如何获取类型以转换为正确的SQL?

1 个答案:

答案 0 :(得分:2)

您可以传递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);