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