linq2db为进出数据库的字段指定自定义转换,以转换为特定的C#类型

linq2db为进出数据库的字段指定自定义转换,以转换为特定的C#类型,c#,db2,linq2db,C#,Db2,Linq2db,在我们必须使用的数据库(即DB2)中,有些字段存储为字符,但实际上是其他对象,最常见的是底层应用程序存储日期和时间的自定义方式。例如: [Table] public class ExampleTable { // This is stored in the DB as a char in the format: 2016-01-11-11.39.53.492000 [Column(Name = "WTIMESTAMP")] public string WriteTimestamp

在我们必须使用的数据库(即DB2)中,有些字段存储为字符,但实际上是其他对象,最常见的是底层应用程序存储日期和时间的自定义方式。例如:

[Table]
public class ExampleTable {
    // This is stored in the DB as a char in the format: 2016-01-11-11.39.53.492000
    [Column(Name = "WTIMESTAMP")] public string WriteTimestamp { get; set; }
}
是否有一种方法可以告诉linq2db在转换到数据库或从数据库转换时要使用的转换方法,这也允许我们将这些属性作为我们想要的对象(例如,C#DateTime对象)访问,但以正确的格式保存回来

我想到的一件事是:

[Table]
public class ExampleTable {

    public DateTime WriteTimestamp { get; set; }

    // This is stored in the DB as a char in the format: 2016-01-11-11.39.53.492000
    [Column(Name = "WTIMESTAMP")] public string WriteTimestampRaw 
    { 
        get {
            return ConvertWriteTimestampToDb2Format(WriteTimestamp);
        } 
        set {
            WriteTimestamp = ConvertWriteTimestampToDateTime(value);    
        }
    }
}
然后我们访问WriteTimestamp,但linq2db在查询中使用WriteTimestampRaw


但是,我不确定这是最好的还是唯一的选择。提前谢谢。

好吧。。。刚刚注意到在我发布我的答案后,你说的是
linq2db
,而不是实体框架。也许它仍然会给你一些想法


在使用Entity Framework之前,我所做的工作(虽然不是特别针对DB2,但我认为它仍然可以工作),就是使用提供的代码允许私有属性映射到数据库列。然后,我有一些类似于您的代码的东西,除了getter和setter是相反的:

[Table("ExampleTable")]
public class ExampleTable
{
    [NotMapped]
    public DateTime WriteTimestamp
    {
        get
        {
            var db2Tstamp = DB2TimeStamp.Parse(WriteTimestampRaw);
            return db2Tstamp.Value;
        }
        set
        {
            var db2Tstamp = new DB2TimeStamp(value);
            WriteTimestampRaw = db2Tstamp.ToString();
        }
    }

    // This is stored in the DB as a char in the format: 2016-01-11-11.39.53.492000
    [Column("WTIMESTAMP")]
    private string WriteTimestampRaw { get; set; }
}

我使用了来处理字符串和日期时间值之间的转换,但您可能可以随意进行转换。

您可以使用MappingSchema.SetConverter方法在客户端上设置特定类型之间的转换。或MappingSchema.SetConverterExpression创建转换器作为查询树的一部分。

是DB2
(VAR)CHAR
中的实际数据类型?如果它是
时间戳
类型,如果您使用日期时间数据类型,.net应该能够转换它。@bhamby不幸的是,它是CCID为37的字符类型。还有其他一些类似的东西。例如,在另一个地方,他们只以朱利安日期格式(YYYYDDD,其中DDD是一年中的一天)存储一个日期,它实际上是以十进制格式存储的。计划于本周发布的inq2db 3.0.0-rc1使用值转换器添加了每列转换配置支持。我认为这样做会奏效。我在我的数据库中反转getter/setter的主要原因是,我认为如果DB设置private
WriteTimestampRaw
,然后设置public WriteTimestamp,这意味着它只转换来自DB的一次,然后再次返回。在这里,它会(iirc)将每次调用转换为WriteTimestamp。我看得越多,就越觉得这是我要走的路。谢谢(编辑:同样,这个概念也应该从EF带到这里。)@ThomasF。想了一会儿,我想我更喜欢你的方法,而不是我自己的方法。在我看来,访问代码中的属性可能比向数据库写入或从数据库写入更多。我得试一下,看看有什么不同!了解这些差异会很有趣。虽然我不会说这个应用程序会受到攻击,但它会有一些流量。我不知道您的实现和我的实现之间的差异是否足以产生多大影响,但仍然如此。目前我唯一不喜欢的是,linq2db不能对私有属性做任何事情:/无论如何,我很想听听你的想法!谢谢,我明天进办公室时会看看这个。您是否碰巧有一个小代码块演示它,或者我可以参考的文档?编辑:基本上我不知道它在哪里用过,就是这样。谢谢!我没想到要去检查一下。我明天再看一遍