복잡한 개체 배열을 dapper가있는 저장 프로 시저에 전달합니다.

dapper stored-procedures

문제

나는 더 이상 관련 통합에 대해 누군가를 돕고 있으며, 현재 우리는 저장 프로 시저에 들어가기 위해 필요한 데이터가있는 시나리오가 있습니다. 그래서 우리는 원하는 스토어드 프로 시저를 작성할 수 있지만, 우리가 원하지만 어버이 비트를 작성할 수는 있지만 오브젝트는 다음과 같이 보일 것입니다.

public class SomeComplexObject
{
   public string Something {get; set;}
   public string SomethingElse {get;set;}
}

이것은 배열 내에서 1-N 양의 이러한 객체로 구성됩니다. 그래서 우리는 이것을 내부 프로덕트의 일부로 사용하기 위해 저장 프로 시저에 전달해야합니다.

그래서 내가 뭔가를해야한다면 :

new SqlParameter("arrayOfGoodies", arrayOfComplexObjects);

그러나 그것은 우리에게 오류를 준다 :

객체 유형에서 매핑이 없습니다.

이것은 Pocos 배열을 SQL 세계로 변환하는 방법을 어떻게 알 수 있겠지만이 데이터를 스토어드 프로 시저로 가져와야합니다. 그래서 이것을 할 수있는 방법이 있습니다.이 유형에 대해 dapper에게 알려주거나 테이블 값 매개 변수 등을 사용하는 것일까 요?

인기 답변

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 #

using Dapper;
using Npgsql;
using System;
using System.Collections.Generic;
using System.Data;

namespace DapperSPWithClass
{
    public class User
    {
        public long ID { get; set; }
        public string Login { get; set; }
        public string Owner_Name { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var connectionString = "Server=127.0.0.1;Port=5432;Database=test;User     Id=My;Password=SuperSecretPass;Timeout=15;";
            var lsUser = new List<User> {
            new User{
                ID=13,
                Login="kos@test5"
            },
            new User{
                ID=29,
                Login="nsk@autotest1"
            }};

            using (var conn = new NpgsqlConnection(connectionString))
            {
                conn.Open();
                conn.TypeMapper.MapComposite<User>("t_user_test"); // Here is the magic we needed
                var res = conn.Query<User>("test_pass_object_array", commandType:     CommandType.StoredProcedure, param: new { i_users = lsUser });

            }

            Console.ReadKey();
        }
}

}

conn.TypeMapper.MapComposite<T>("t_user_test");

https://www.npgsql.org/doc/types/enums_and_composites.html 에서 MapComposite를 찾았습니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow