Dapper 如何将带有对象列表的对象传递到存储过程中

问题描述 投票:0回答:1

我在使用 Dapper 执行现有存储过程时遇到问题。存储过程采用一些参数和用户定义类型对象的列表。我模仿了C#中所需的参数,但有些转换不顺利,导致出现异常(如下所示),我不知道如何解决它。

Sql 存储过程:

ALTER PROCEDURE [dbo].[MySp]
    @Name VARCHAR(60),
    @Size BIGINT,
    @Photos MyPhoto READONLY
AS
BEGIN
... logic

其中 MyPhoto 是用户定义的表格类型,其中:

Name VARCHAR(25),
Model VARCHAR(25)

在 C# 方面我有:

public class MyClassForSP
{
  public string Name {get;set;}
  public Int64 Size {get;set;}
  public List<Photos> Photos {get;set;}
}

public class Photos
{
  public string Name {get;set}
  public string Model {get;set;}
}

到目前为止,一切看起来对我来说都是合乎逻辑的...所以我尝试执行一个sql请求:

public void ExecuteSp(MyClassForSP classForSp)
{
  using IDbConnection connection = new SqlConnection(_settings.ConnectionString);
  var result = await connection.QuerySingleAsync<MyResult>("dbo.MySp", classForSp, 
    commandType: CommandType.StoredProcedure);
}

结果我遇到了 Dapper 错误:System.NotSupportedException:“MyNameSpace.Photos 类型的成员不能用作参数值”

c# sql sql-server dapper
1个回答
0
投票

您需要通过提供 DataTable 来使用

表值参数

DataTable dt = new DataTable();
dt.Columns.Add("Name");
dt.Columns.Add("Model");

foreach (var photo in classForSp.Photos) 
{
    dt.Rows.Add(photo.Name, photo.Model);
}

using IDbConnection connection = new SqlConnection(_settings.ConnectionString);
var result = await connection.QuerySingleAsync<MyResult>("dbo.MySp", 
    new 
    { 
        Name = classForSp.Name, 
        Size = classForSp.Size, 
        Photos = dt.AsTableValuedParameter("MyPhoto") 
    }, 
    commandType: CommandType.StoredProcedure);
© www.soinside.com 2019 - 2024. All rights reserved.