如何将Dictionary或任何其他元组类型传递到存储过程?
存储过程定义为:
.jpg
CREATE PROCEDURE [dbo].[Components]
(
@OrderTypeID INT = NULL,
@OrderTypeKey VARCHAR(40) = NULL,
@SegmentID INT = NULL,
@SegmentKey VARCHAR(40) = NULL,
@FilterPairs KeyValuePair READONLY
)
AS
BEGIN
..
定义为:
这就是我调用sproc的方式:
KeyValuePair
如何将Dictionary或任何其他元组类型传递给用户定义的表类型参数的存储过程?
请注意,如果可能,我不想将SqlParameter
用于此实施。
答案 0 :(得分:1)
当您标记问题实体框架时,我假设您有一个DbContext
。
此DbContext
表示(访问)您的数据库。它具有数据库中所有表的DbSet。它知道表之间的关系,它也应该知道如何调用存储过程。
毕竟,dbContext的用户在调用存储过程时是否需要做一些与处理表时不同的事情?
因此,对存储过程的调用应该是DbCntext中的一个函数
class MyDbContext : DbContext
{
public DbSet<...> Table1 {get; set;}
public DbSet<...> Table2 {get; set;}
#region stored procedures
public void Components(int orderTypeId, string orderTypeKey, ...
KeyValuePair<string, string> pair, ...)
{
// TODO: fill code
}
}
更改存储过程。 @FilterPairs应该是两个参数:
@FilterKey,
@FilterValue,
现在可以很容易地实现过程组件:
public void Components(int orderTypeId, string orderTypeKey, ...
KeyValuePair<string, string> pair, ...)
{
object[] functionParameters = new object[]
{
new SqlParameter(@"OrderTypeId", orderTypeId),
new SqlParameter(@"OrderTypeKey", orderTypeKey),
...
// The KeyValuePair: in your store procedure two parameters:
new SqlParameter(@"FilterKey", pair.Key),
new SqlParameter(@"FilterValue", pair.Value),
};
const string sqlCommans = @"Exec ...
@OrderTypeId, @OrderTypeKey, ...
@FilterKey, @FilterValue, ...";
this.Database.ExecuteSqlCommand(sqlComman, functionParameters);
}
如果您想要一个带有Dictionary的函数或任何其他实现IEnumerable<KeyValuePair<string, string>>
的类