如何将键值对传递给用户定义的表类型?

时间:2017-11-14 17:05:17

标签: c# .net sql-server entity-framework tsql

如何将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 .. 定义为:

enter image description here

这就是我调用sproc的方式:

KeyValuePair

如何将Dictionary或任何其他元组类型传递给用户定义的表类型参数的存储过程?

请注意,如果可能,我不想将SqlParameter用于此实施。

1 个答案:

答案 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>>的类

,您将知道该怎么做