2014-05-11 22 views
4

我有一個帶有3個輸入參數的存儲過程。Dapper:幫助我使用多個用戶定義的表類型運行存儲過程

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

我需要運行原始存儲過程的幫助。 謝謝。

回答

7

Dapper具有擴展方法來處理表值參數。

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

您可以通過以下方式使用短小精悍:

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,@[email protected],@pageSize=20,@skip=0 
+0

我想多一點的解釋將是很好:) – DatRid

+0

小巧玲瓏具有擴展方法與表值參數的工作。公共靜態SqlMapper.ICustomQueryParameter AsTableValuedParameter(此DataTable表,字符串typeName = null) – Dmitry

+0

只需將解釋添加到答案:)順便說一句好的答案!它只是純代碼的答案大多不會幫助一般,所以更多你給的解釋,對其他用戶更有用! – DatRid

0

我回答了類似的帖子在Call stored procedure from dapper which accept list of user defined table type具有以下,我認爲這也可以幫助你!

我知道這有點舊,但我想我會在這個帖子上發表,因爲我試圖讓這個更容易一些。我希望我已經這樣做了NuGet包創建,將允許這樣的代碼:

public class IntList 
{ 
    public int Item { get; set; } 
} 

var list1 = new List<IntList>{new IntList{ Item= 1 }, new IntList{ Item= 2}}; 
var list2 = new List<IntList>{new IntList{ Item= 3 }, new IntList{ Item= 4}}; 

var parameters = new DynamicParameters(); 
parameters.Add("@Keyword", "stringValue"); 
parameters.AddTable("@CategoryIds", "IntList", list1); 
parameters.AddTable("@MarketIds", "IntList", list2); 

var result = con.Query<int>("someSP", parameters, commandType: CommandType.StoredProcedure); 

NuGet包:在其早期階段https://www.nuget.org/packages/Dapper.ParameterExtensions/0.2.0 不過,可能無法與一切工作!

請閱讀README並隨時在GitHub上貢獻:https://github.com/RasicN/Dapper-Parameters

相關問題