如何让Dapper动态不区分大小写?

时间:2016-06-24 04:00:42

标签: c# oracle dapper

我正在使用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

1 个答案:

答案 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;
        }   
    }
}