C# 如何获得不区分大小写的简洁动态?

C# 如何获得不区分大小写的简洁动态?,c#,oracle,dapper,C#,Oracle,Dapper,我在Oracle中使用Dapper。Oracle查询结果列不区分大小写(除非双引号),Oracle以大写形式返回列名。因此,在使用dynamic时,Dapper需要使用大写字段名 在使用Dynamic时,有没有办法使Dapper不在乎大小写?我在DappTable中看到它使用了一个带有StringComparer.Ordinal的字典,而不是StringComparer.OrdinalIgnoreCase,我看不到任何更改它的选项。但我希望有人能解决这个问题,或者能告诉我如何更好地解决这个问题

我在Oracle中使用Dapper。Oracle查询结果列不区分大小写(除非双引号),Oracle以大写形式返回列名。因此,在使用dynamic时,Dapper需要使用大写字段名

在使用Dynamic时,有没有办法使Dapper不在乎大小写?我在DappTable中看到它使用了一个带有StringComparer.Ordinal的字典,而不是StringComparer.OrdinalIgnoreCase,我看不到任何更改它的选项。但我希望有人能解决这个问题,或者能告诉我如何更好地解决这个问题

例如:

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.
编辑:

请参阅,了解枚举属性的另一种方法,以执行类似于下面所述的操作(您可以将
动态
转换为
IDictionary

另外(对Oracle不太熟悉,不知道这是不是真的),但可能是您在SELECT查询中使用别名(即在T-SQL中使用
作为
),这会覆盖大小写

原件:

(马克·格雷威尔说,下面这句话不适合整洁的人。)

是否从工作中调整想法(特别是未经整洁测试)

使用NUnit.Framework;
使用制度;
使用System.Collections.Generic;
命名空间StackOverflowSandbox
{
公共类到字典测试
{
[测试]
公共空间无效其应工作()
{
//安排
var dapperResult=新
{
上限=1,
下限=2
};
//表演
var dictionary=dapperResult.ConvertToDictionary();
//断言
Assert.That(dictionary[“Upper”],即.EqualTo(1));
Assert.That(dictionary[“Lower”],即.EqualTo(2));
}
}
公共静态类对象扩展
{
私有静态只读StringComparer到DictionaryDefaultComparer=
普通木糖酶;
/// 
///转换可读取的对象属性
///给词典。
/// 
公共静态IDictionary转换为字典(
这个物体@这个,
StringComparer(比较器=空)
{
//以下内容改编自:
// https://stackoverflow.com/a/15698713/569302
var字典=新字典(
比较器??ToDictionalDefaultComparer);
foreach(@this.GetType().GetProperties()中的var propertyInfo)
{
如果(propertyInfo.CanRead&&
propertyInfo.GetIndexParameters().Length==0)
{
字典[propertyInfo.Name]=
propertyInfo.GetValue(@this,null);
}
}
返回字典;
}   
}
}

那是行不通的;查询中的对象是真正意义上的动态对象-请求反射属性是没有意义的。例如,Jared,要对Oracle区分大小写,您需要:从dual中选择1作为“QuotesMakeItCaseSensitive”。只是我必须避开双引号,sql开始变得粗糙,它不再是轻量级的。我确实认为我可以在IDictionary上创建一个扩展方法,该方法返回不区分大小写的IDictionary。这似乎是最好的解决方案,而不改变整洁本身;问题是,其他ado.net提供程序将其设置为“正确”,并允许按大小写区分名称alone@MarcGravell-我看到了Dapper.DefaultTypeMap.MatchNameswithUnderlines=true的一些东西;将使其不区分大小写,但如果它区分大小写,我认为这仅适用于属性匹配。这将是非常有帮助的,有一个选项,使这项工作的开箱即用的整洁。
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;
        }   
    }
}