Dapper: aidez-moi à exécuter la procédure stockée avec plusieurs types de table définis par l'utilisateur

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

Question

J'ai une procédure stockée avec 3 paramètres d'entrée.

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

Où IntList est le type de tableau défini par l'utilisateur.

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

Mon but est d'appeler cette procédure stockée avec dapper.

J'ai trouvé quelques exemples concernant le passage de type défini par l'utilisateur avec dapper. L'un d'entre eux est la classe TableValuedParameter implémentée dans le package nuget Dapper.Microsoft.Sql.

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

Écrit ci-dessus code jette

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

J'ai testé ma procédure stockée avec un type de tableau défini par l'utilisateur et cela fonctionnait bien.

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

J'ai besoin d'aide pour exécuter la procédure stockée d'origine. Je vous remercie.

Réponse populaire

Dapper a une méthode d'extension pour travailler avec les paramètres de la table.

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

Vous pouvez utiliser dapper de la manière suivante:

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

Il sera traduit en 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



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi