【问题标题】:SQLite+Dapper: Convert values to enumSQLite+Dapper:将值转换为枚举
【发布时间】:2018-01-16 02:24:52
【问题描述】:

我有一个带有 event 表的 SQLite 数据库,该表由四列组成:id (INT)、timestamp (TEXT)、level (TEXT) 和 message (TEXT)。当我读回事件时,我想将 level 值转换为相应的 LogLevel 枚举值。文本值与枚举成员名称相同。我怎样才能做到这一点?我看到如果我使用Query<object>,我会得到一个列表,我可以在其中枚举所有行并将它们转换为新的Event 结构值之前。但这是最好/最简单的方法吗?

public struct Event
{
    public Event(DateTime timestamp, LogLevel level, string message)
    {
        Timestamp = timestamp;
        Level = level;
        Message = message;
    }
    public DateTime Timestamp { get; }
    public LogLevel Level { get; }
    public string Message { get; }
}

public enum LogLevel
{
    FATAL,
    ERROR,
    WARN,
    INFO
}

public List<Event> GetNewEvents(uint rowId)
{
    var events = _dbConnection.Query<Event>("SELECT * FROM events WHERE id >= @RowId;", new { RowId = rowId });
    return events.ToList();
}

【问题讨论】:

    标签: c# sqlite enums dapper


    【解决方案1】:

    如果您的“级别”列值与枚举值匹配,Dapper 将自动映射枚举值。但是,您可能对该构造函数有疑问。也不知道你为什么使用 struct。只需将您的事件更改为以下结构即可。

    public class Event
    {           
        public DateTime Timestamp { get; set; }
        public LogLevel Level { get; set; }
        public string Message { get; set; }
    }
    

    休息是一样的。

    【讨论】:

    • 我使用了一个结构,因为我认为它只是一个值的占位符,在创建时它永远不会改变。实际上,我使用结构还是类似乎并不重要。正如您所指出的,问题出在构造函数上。
    • 但是,在这种情况下,为什么我应该使用类而不是结构?就我所见,两者的工作原理都是一样的。
    • 在你的情况下没有区别。两者都可以正常工作。这只是经验法则。
    • 经验法则是什么?您只是在告诉我从结构更改为类,但不是为什么。
    猜你喜欢
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2021-01-04
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多