C# 如何将键值对传递到用户定义的表类型中?

C# 如何将键值对传递到用户定义的表类型中?,c#,.net,sql-server,entity-framework,tsql,C#,.net,Sql Server,Entity Framework,Tsql,如何将字典或任何其他元组类型传递到存储过程中 存储过程定义为: CREATE PROCEDURE [dbo].[Components] ( @OrderTypeID INT = NULL, @OrderTypeKey VARCHAR(40) = NULL, @SegmentID INT = NULL, @SegmentKey VARCHAR(40) = NULL, @FilterPairs KeyValuePair READONLY ) AS BEGIN .. 其中,Ke

如何将字典或任何其他元组类型传递到存储过程中

存储过程定义为:

CREATE PROCEDURE [dbo].[Components]
(
  @OrderTypeID INT = NULL,
  @OrderTypeKey VARCHAR(40) = NULL,
  @SegmentID INT = NULL,
  @SegmentKey VARCHAR(40) = NULL,
  @FilterPairs KeyValuePair READONLY
)
AS 
BEGIN
..
其中,KeyValuePair定义为:

CREATE PROCEDURE [dbo].[Components]
(
  @OrderTypeID INT = NULL,
  @OrderTypeKey VARCHAR(40) = NULL,
  @SegmentID INT = NULL,
  @SegmentKey VARCHAR(40) = NULL,
  @FilterPairs KeyValuePair READONLY
)
AS 
BEGIN
..
这就是我对存储过程的称呼:

context.Database.SqlQuery<EntityType>(
    @"declare param1 int = --some logic
      declare param2 varchar = --some logic
      EXEC Components @param1=@param1,@param2=@param2"
);
如何将字典或任何其他元组类型传递到用户定义的表类型参数的存储过程中

请注意,如果可能的话,我不想用于此实现。

在标记问题实体框架时,我假设您有一个DbContext

此DbContext表示对数据库的访问。它有数据库中所有表的数据库集。它知道表之间的关系,还应该知道如何调用存储过程

毕竟,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
    }
}
现在将很容易实现程序组件:

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

如果您想要一个接受字典的函数,或者实现IEnumerable的任何其他类,您将知道该怎么做这可能有助于他们将过程设置为接收表值参数。这意味着它们应该能够在存储过程的一次调用中传递0、1或多个键/值对。非常感谢,@harald,这非常有用。这是否可能与表值参数有关?无论如何,我将在一个单独的项目中使用您的有用答案,我不确定在这个上下文中表值参数是什么。这是要用作过程参数的表中的一行吗?当然,您可以传递对象,而不是所有单独的参数。我认为您不能将对象作为参数传递给存储过程,您必须使用SqlParameter来实现这一点。另一方面,优点是这样可以隐藏您正在使用的存储过程,将来可以将其更改为不同的过程或非存储过程,从而提高在不同数据库中的可重用性