동적으로 결정된 속성 이름을 사용하여 익명 객체를 만드는 방법은 무엇입니까?

anonymous-types c# dapper

문제

주어진 값의 배열을 감안할 때이 값을 기반으로하는 속성을 가진 익명 객체를 만들고 싶습니다. 프로퍼티 명은 간단하게 "pN" . N 는 배열 내의 값의 인덱스입니다.

예를 들어, 주어진

object[] values = { 123, "foo" };

익명의 개체를 만들고 싶습니다.

new { p0 = 123, p1 = "foo" };

나는이 작업을 수행하는 생각할 수있는 유일한 방법은 사용하는 것입니다 switch 또는 if 이 작업을 수행하는 더 우아한 방법이 있다면 지원하는 매개 변수의 적절한 수에 체인까지,하지만 궁금 해서요 :

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

배경

데이터베이스에 대해 SQL 문을 실행하는 기존 메서드 집합이 있습니다. 이 메소드는 일반적으로 sql 문의 string 을 사용하고 매개 변수가있는 경우 params object[] 를 사용합니다. 쿼리가 매개 변수를 사용하는 경우 @p0, @p1, @p2, etc. 으로 이름이 지정된다는 점을 이해해야합니다.

예:

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

이것은 다음과 같이 호출됩니다.

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

이제 Dapper의 Query<T> 메서드를 래핑하고 공개하고 기존 메서드와 일치하는 방식으로이 클래스 내에서 Dapper 를 사용하려고합니다. 예를 들면 다음과 같습니다.

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

Dapper의 Query<T> 메서드는 익명 객체의 매개 변수 값을 사용합니다.

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

Dapper에게 매개 변수를 전달하는 익명 객체를 만드는 것에 대한 나의 질문이 왔습니다.


@Paolo Tedesco의 요청에 따라 DynamicParameter 클래스를 사용하여 코드 추가.

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

Dapper의 SqlMapper.cs 파일의 581 행에 예외가 발생합니다.

public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }

예외는 SqlException .

스칼라 변수 "@ p0"을 선언해야합니다.

cmd.Parameters 속성을 확인하면 명령에 대해 구성된 매개 변수가 표시되지 않습니다.

인기 답변

Dapper를 오해하고 있습니다. IDynamicParameters 를 구현하거나 매우 유연한 DynamicParameters 클래스를 사용하는 대신이 작업을 수행 할 필요가 없습니다.

특히:

class Stuff
{
   public int Thing { get; set; }
}

...

cnn.Execute("select @Thing", new Stuff{Thing = 1});

DynamicParameters 는 생성자에서 익명 클래스를 가져올 수 있습니다. AddDynamicParams 메서드를 사용하여 DynamicParameters 를 연결할 수 있습니다.

더 나아가, anon-types에 대한 엄격한 의존성은 없습니다. Dapper는 구체적인 유형을 매개 변수로 허용합니다. 예 :

class Stuff
{
   public int Thing { get; set; }
}

...

cnn.Execute("select @Thing", new Stuff{Thing = 1});

Kevin은 비슷한 질문 을했습니다. POCO의 모든 속성을 결합하는 빠르고 쉬운 방법 찾기 - DynamicParameters 는 마술 후프 점프가 필요없이 완벽하게 작동합니다.




아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.