Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Stored procedures 使用dapper将复杂对象数组传递给存储过程_Stored Procedures_Dapper - Fatal编程技术网

Stored procedures 使用dapper将复杂对象数组传递给存储过程

Stored procedures 使用dapper将复杂对象数组传递给存储过程,stored-procedures,dapper,Stored Procedures,Dapper,我正在协助某人进行与简洁相关的集成,目前有一个场景,我们需要将一些数据放入存储过程中。因此,我们可以随心所欲地编写存储过程,也可以随心所欲地编写简洁的位,但对象看起来像: public class SomeComplexObject { public string Something {get; set;} public string SomethingElse {get;set;} } new SqlParameter("arrayOfGoodies", arrayOfCompl

我正在协助某人进行与简洁相关的集成,目前有一个场景,我们需要将一些数据放入存储过程中。因此,我们可以随心所欲地编写存储过程,也可以随心所欲地编写简洁的位,但对象看起来像:

public class SomeComplexObject
{
   public string Something {get; set;}
   public string SomethingElse {get;set;}
}
new SqlParameter("arrayOfGoodies", arrayOfComplexObjects);
这将是在一个数组中,这些对象的数量在1-N之间。因此,我们需要将它们传递给存储的进程,以便它将其用作内部查询的一部分

因此,如果我要做类似的事情:

public class SomeComplexObject
{
   public string Something {get; set;}
   public string SomethingElse {get;set;}
}
new SqlParameter("arrayOfGoodies", arrayOfComplexObjects);
然而,它给了我们一个错误:

对象类型中不存在映射


这是有意义的,因为它如何知道如何将这个POCO数组转换成SQL世界的东西,但不知何故,我需要将这些数据转换到存储过程中。有没有办法做到这一点,可以告诉dapper这种类型,或者可能使用表值参数之类的东西?

您可以将数组作为表值参数传递。不幸的是,您必须首先将其转换为数据表

例如:

    conn.Execute("My_SP", new { values = myTable.AsTableValuedParameter("MyType") }, 
commandType: CommandType.StoredProcedure);

还有一些例子,我为PostgreSQL找到了出路

对于“解释”,选择具有指定ID和登录名的用户列表

以DB为单位:

create table user_apt
(
    id bigint,
    login varchar(100),
    owner_name varchar(500),
    password varchar(50),
    is_active boolean,
    date_edit timestamp default now()
);

create type  t_user_test AS
(
  id bigint,
  login varchar(100),
  owner_name varchar(500)
)

CREATE OR REPLACE FUNCTION test_pass_object_array(i_users t_user_test)
  RETURNS SETOF t_user_test
LANGUAGE plpgsql
AS $$
BEGIN
  return query
  SELECT
    ua.id,
    ua.login,
    ua.owner_name
  FROM user_apt ua
  inner join i_users inp ON ua.id=inp.id AND ua.login=inp.login;
END
$$;
在C中#

使用简洁;
使用Npgsql;
使用制度;
使用System.Collections.Generic;
使用系统数据;
命名空间DapperpWithClass
{
公共类用户
{
公共长ID{get;set;}
公共字符串登录{get;set;}
公共字符串所有者\u名称{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
var connectionString=“服务器=127.0.0.1;端口=5432;数据库=test;用户Id=My;密码=SuperSecretPass;超时=15;”;
var lsUser=新列表{
新用户{
ID=13,
登录名=”kos@test5"
},
新用户{
ID=29,
登录名=”nsk@autotest1"
}};
使用(var conn=新的NpgsqlConnection(connectionString))
{
conn.Open();
MapComposite(“t_user_test”);//这是我们需要的魔法
var res=conn.Query(“test_pass_object_array”,commandType:commandType.StoredProcedure,param:new{i_users=lsUser});
}
Console.ReadKey();
}
}
}

conn.TypeMapper.mapscomposite(“t_user_test”);
我在文章中找到了MapComposite