Dapper : 여러 사용자 정의 테이블 형식으로 저장 프로 시저를 실행하도록 도와주세요.

c# dapper sql stored-procedures user-defined-types

문제

세 가지 입력 매개 변수가있는 저장 프로 시저가 있습니다.

... PROCEDURE [dbo].[gama_SearchLibraryDocuments]
@Keyword nvarchar(160), 
@CategoryIds [dbo].[IntList] READONLY, 
@MarketIds [dbo].[IntList] READONLY ...

여기서 IntList는 사용자 정의 테이블 유형입니다.

CREATE TYPE [dbo].[IntList]
AS TABLE ([Item] int NULL);

내 목표는이 저장 프로 시저를 dapper로 호출하는 것입니다.

나는 dapper로 사용자 정의 유형을 전달하는 것에 관한 몇 가지 예를 발견했다. 그 중 하나는 Dapper.Microsoft.Sql nuget 패키지에 구현 된 TableValuedParameter 클래스입니다.

var list = conn.Query<int>("someSP", new
{
Keyword = (string)null,
CategoryIds = new TableValuedParameter<int>("@CategoryIds", "IntList", new List<int> { }),
MarketIds = new TableValuedParameter<int>("@MarketIds", "IntList", new List<int> { 541 })
}, commandType: CommandType.StoredProcedure).ToList();

코드 위의 쓰레기

An exception of type 'System.NotSupportedException' occurred in Dapper.dll but was not handled in user code

Additional information: The member CategoryIds of type Dapper.Microsoft.Sql.TableValuedParameter`1[System.Int32] cannot be used as a parameter value

한 사용자 정의 테이블 형식으로 내 저장된 프로 시저를 테스트하고 잘 작동했습니다.

conn.Query<int>("someSP", new TableValuedParameter<int>("@MarketIds", "IntList", new List<int> { 541 }), commandType: CommandType.StoredProcedure).ToList();

원본 저장 프로 시저를 실행하는 데 도움이 필요합니다. 고맙습니다.

인기 답변

Dapper에는 테이블 값 매개 변수로 작업하는 확장 메서드가 있습니다.

public static SqlMapper.ICustomQueryParameter AsTableValuedParameter(this DataTable table, string typeName = null)

다음과 같은 방법으로 dapper를 사용할 수 있습니다.

var providersTable = new DataTable();
providersTable.Columns.Add("value", typeof(Int32));
foreach (var value in filterModel.Providers)
{
    providersTable.Rows.Add(value);
}
var providers = providersTable.AsTableValuedParameter("[dbo].[tblv_int_value]");

var filters =
    new
    {
        campaignId = filterModel.CampaignId,
        search = filterModel.Search,
        providers = providers,
        pageSize = requestContext.PageSize,
        skip = requestContext.Skip
    };

using (var query = currentConnection.QueryMultiple(StoredProcedureTest, filters, nhTransaction, commandType: CommandType.StoredProcedure))
{
    var countRows = query.Read<int>().FirstOrDefault();
    var temp = query.Read<CategoryModel>().ToList();
    return new Result<IEnumerable<CategoryModel>>(temp, countRows);
}

그것은 SQL로 번역 될 것입니다 :

declare @p3 dbo.tblv_int_value
insert into @p3 values(5)
insert into @p3 values(34)
insert into @p3 values(73)
insert into @p3 values(14)

exec [dbo].[StoredProcedureTest] @campaignId=123969,@search=NULL,@providers=@p3,@pageSize=20,@skip=0


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow