gpt4 book ai didi

c# - 如何使 Dapper 动态不区分大小写?

转载 作者:太空宇宙 更新时间:2023-11-03 12:43:55 25 4
gpt4 key购买 nike

我将 Dapper 与 Oracle 结合使用。 Oracle 查询结果列不区分大小写(除非您将它们加双引号),并且 Oracle 以大写形式返回列名。因此,在使用动态时,Dapper 需要使用大写的字段名。

有没有办法让 Dapper 在使用 Dynamic 时不关心大小写?我在 DapperTable 中看到 http://dapper-dot-net/Dapper/SqlMapper.DataTable.cs它使用带有 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.

最佳答案

编辑:

参见 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;
}
}
}

关于c# - 如何使 Dapper 动态不区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38005393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com