首页 > 解决方案 > Dapper 可以映射包含破折号的枚举值吗?

问题描述

我正在尝试将包含破折号(“-”)的结果集的值映射到枚举值。

考虑下表:

CREATE TABLE Greeting
(
    GreetingId   INT PRIMARY KEY,
    Text         NVARCHAR(64),
    LanguageCode NVARCHAR(16)
)

从中选择会产生以下结果集:

SELECT GreetingId, Text, LanguageCode FROM Greeting;

+------------+-------------+--------------+
| GreetingId | Text        | LanguageCode |
+------------+-------------+--------------+
| 1          | Hello World | en-US        |
+------------+-------------+--------------+
| 2          | Hallo Welt  | de-DE        |
+------------+-------------+--------------+

此结果集应映射到如下所示的对象结构:

class Greeting
{
    public int GreetingId { get; set; }
    
    public string Text { get; set; }
    
    public Language LanguageCode { get; set; }
}

enum Language
{
    DeDe,
    
    EnUs
}

查询是这样执行的:

using (var connection = new SqlConnection(CONNECTION_STRING))
{
    var result = connection.Query<Greeting>("SELECT GreetingId, Text, LanguageCode FROM Greeting");
}

上面的查询导致System.Data.DataException告诉我Error parsing column 2 (LanguageCode=de-DE - String)。这显然是因为结果集中的“de-DE”无法映射到“Language.DeDe”。

现在我只是想知道在将结果集映射到对象时是否有任何方法可以忽略“-”?已经有一种方法可以使用 . 忽略列名中的“_” Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true;。当涉及到结果集内容中的破折号时,是否有类似的东西?

解决此问题的明显方法之一是将 SQL 命令重写为:

SELECT
    GreetingId,
    Text,
    REPLACE(LanguageCode, '-', '') AS 'LanguageCode'
FROM
    Greeting

...当映射到上面的对象结构时,它就像一个魅力。但是我仍然想知道在映射枚举时是否可以“忽略”破折号?

标签: c#sqldappermicro-orm

解决方案


推荐阅读