대문자와 소문자를 구별하지 않고 Dapper 동적을 얻는 방법?

c# dapper oracle

문제

오라클과 함께 Dapper를 사용하고 있습니다. Oracle 쿼리 결과 열은 큰 따옴표를 사용하지 않는 한 대 / 소문자를 구분하지 않으며 Oracle은 대문자로 열 이름을 반환합니다. 따라서 동적 인 경우 Dapper는 대문자 필드 이름을 사용해야합니다.

Dynamic을 사용할 때 Dapper가 대소 문자를 신경 쓰지 않게하는 방법이 있습니까? DapperTable http : //dapper-dot-net/Dapper/SqlMapper.DataTable.cs 에서 StringComparer.OrdinalIgnoreCase 대신 StringComparer.Ordinal이있는 Dictionary를 사용한다는 것을 알았 습니다. 변경하는 옵션이 표시되지 않습니다. 그러나 나는 누군가가 이것을위한 해결책을 갖고 있거나, 더 나은 방법으로 그것을하는 방법을 알려줄 수 있기를 바라고있다.

예:

var r = cnn.Query("select 'apple' fruit from dual").FirstOrDefault();
var f = r.Fruit; // f is set to null, but I want it to be "apple"
var F = r.FRUIT; // F is set to "apple", but I don't want to reference using all caps.

수락 된 답변

편집하다:

참조 이 답변 어쩌면 다른 방법은 내가 아래에있는 것과 비슷한 작업을 수행 할 속성을 통해 열거 할을 (당신이 캐스팅 할 수있을 dynamic int로서 IDictionary<string,object> ).

또한 (오라클과 충분히 친숙하지 않아 이것이 사실인지 아닌지) 알지 못하지만 SELECT 쿼리 (예 : T-SQL의 AS 사용)에서 열 이름을 별명으로 지정하면 대문자가 무시 될 수 있습니까?

실물:

(Marc Gravell은 다음은 Dapper와 작동하지 않는다고 말했습니다.)

이 답변 의 아이디어를 적용하면 효과가 있습니까 (구체적으로 Dapper에서 테스트하지 않은 경우)?

using NUnit.Framework;
using System;
using System.Collections.Generic;

namespace StackOverflowSandbox
{
    public class ToDictionaryTests
    {
        [Test]
        public void ItShouldWork()
        {
            // Arrange
            var dapperResult = new
            {
                UPPER = 1,
                lower = 2
            };

            // Act
            var dictionary = dapperResult.ConvertToDictionary();

            // Assert
            Assert.That(dictionary["Upper"], Is.EqualTo(1));
            Assert.That(dictionary["Lower"], Is.EqualTo(2));
        }
    }

    public static class ObjectExtensions
    {
        private static readonly StringComparer ToDictionaryDefaultComparer =
            StringComparer.OrdinalIgnoreCase;

        /// <summary>
        /// Converts an object's properties that can be read
        /// to an IDictionary.
        /// </summary>
        public static IDictionary<string, object> ConvertToDictionary(
            this object @this,
            StringComparer comparer = null)
        {
            // The following is adapted from: 
            // https://stackoverflow.com/a/15698713/569302
            var dictionary = new Dictionary<string, object>(
                comparer ?? ToDictionaryDefaultComparer);
            foreach(var propertyInfo in @this.GetType().GetProperties())
            {
                if (propertyInfo.CanRead && 
                    propertyInfo.GetIndexParameters().Length == 0)
                {
                    dictionary[propertyInfo.Name] = 
                        propertyInfo.GetValue(@this, null);
                }
            }

            return dictionary;
        }   
    }
}


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