我正在使用Dapper和Oracle。 Oracle查询结果列不区分大小写(除非您对它们进行双引号),Oracle以大写形式返回列名。因此,当使用动态时,Dapper需要使用大写字段名。
有没有办法让Dapper在使用Dynamic时不关心案例?我在DapperTable http://dapper-dot-net/Dapper/SqlMapper.DataTable.cs中看到它使用带有StringComparer.Ordinal的Dictionary而不是StringComparer.OrdinalIgnoreCase,我没有看到任何更改它的选项。但我希望有人能为此提供解决方案,或者可以告诉我如何更好地解决这个问题。
示例:
Entry = Inputbox("Welcome To The Solus Project!" & vbNewLine & "" & vbNewLine & "Enter" & vbNewLine & "Setup" & vbNewLine & "Quit", "Solus Entry")
If Entry = "Setup" Then
InputName = Inputbox("Please Enter Your Name", "Name")
ElseIf Entry = "Quit" Then
Wscript.Quit
ELseIf Entry = "Enter" Then
答案 0 :(得分:1)
修改强>
请参阅this answer,可能有另一种方法来枚举属性,以执行类似于下面的操作(您可以将dynamic
强制转换为IDictionary<string,object>
)。
另外(不熟悉Oracle以了解这是否属实)但是如果你在SELECT查询中使用列名称(即在T-SQL中使用AS
),则会覆盖套管?
<强>原始强>
(Marc Gravell说以下内容不适用于Dapper。)
是否适应this answer工作的想法(未经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;
}
}
}