값 배열이 주어지면이 값을 기반으로하는 속성을 사용하여 익명 개체를 만들고 싶습니다. 등록 정보 이름은 간단히 "pN"
일 수 있습니다. 여기서 N
은 배열 값의 색인입니다. 주어진 예를 들어동적으로 결정된 속성 이름을 사용하여 익명 개체를 만드는 방법은 무엇입니까?
,
object[] values = { 123, "foo" };
나는를 사용하는 것입니다
new { p0 = 123, p1 = "foo" };
내가 생각할 수있는 유일한 방법은이 작업을 수행하는 익명 객체를 생성하고 싶습니다 switch
또는 if
지원할 수있는 합리적인 수의 매개 변수를 연결해야하지만이 작업을 수행하는보다 우아한 방법이 있는지 궁금합니다.
object[] parameterValues = new object[] { 123, "foo" };
dynamic values = null;
switch (parameterValues.Length)
{
case 1:
values = new { p0 = parameterValues[0] };
break;
case 2:
values = new { p0 = parameterValues[0], p1 = parameterValues[1] };
break;
// etc. up to a reasonable # of parameters
}
배경
나는 데이터베이스에 대해 SQL 문을 실행할 방법을 기존의 세트가있다. 메서드는 일반적으로 SQL 문에 대해 string
을 사용하고 매개 변수가있는 경우 params object[]
을 사용합니다. 쿼리가 매개 변수를 사용하는 경우 해당 매개 변수의 이름은 @p0, @p1, @p2, etc.
입니다.
예 : 다음과 같이 호출 할 것이다
public int ExecuteNonQuery(string commandText, CommandType commandType, params object[] parameterValues) { .... }
:
이제db.ExecuteNonQuery("insert into MyTable(Col1, Col2) values (@p0, @p1)", CommandType.Text, 123, "foo");
나는 포장하고 말끔의 Query<T>
방법을 노출하고, 그렇게 할이 클래스에서 Dapper를 사용하고 싶습니다 기존의 방법들, 예를 들면
public IEnumerable<T> ExecuteQuery<T>(string commandText, CommandType commandType, params object[] parameterValues) { .... }
하지만 말끔의 Query<T>
방법은 익명의 객체의 매개 변수 값을 취합니다 : 뭔가처럼
var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
단정 한 매개 변수를 전달하기 위해 익명 객체를 만드는 방법에 대한 내 질문에 선도. @Paolo 테 데스 코의 요청에 따라
DynamicParameter
클래스를 사용하여 코드를 추가.
string sql = "select * from Account where Id = @p0 and username = @p1";
dynamic values = new DynamicParameter(123, "test");
var accounts = SqlMapper.Query<Account>(connection, sql, values);
는 말끔의 SqlMapper.cs 파일의 라인 (581)에서 예외가 발생합니다 :
using (var reader = cmd.ExecuteReader())
과를 제외하고는 SqlException
입니다 :
은 스칼라 변수 "@ P0"를 선언해야합니다.
을 확인하고 cmd.Parameters
속성을 검사하면 명령에 대해 구성된 매개 변수가 표시되지 않습니다.
예, DynamicParameter를 잘못 사용하고 있습니다 (243 행 참조). http://code.google.com/p/dapper-dot-net/source/browse/Tests/Tests.cs –
또한 'IDynamicParamters'는 적응성. 대용품의 경우 익숙하지 않은 종류의 빵을 구울 필요가 없습니다. 학습 경험으로는 할 수 있지만, 그만한 가치는 없습니다. 특히 emit을 사용하고 싶다면 ICollection에서 강력한 유형을 구울 수 있습니다. –