linq2db 为进入/来自数据库的字段指定自定义转换以转换 to/from 特定的 C# 类型
linq2db specify custom conversions for fields going to / from the database to convert to/from specific C# types
在我们必须使用的数据库(即 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。不过,也许它仍然会给你一些想法。
我之前使用 Entity Framework 所做的(虽然不是专门针对 DB2,但我认为它应该仍然有效),是使用提供的代码 in this answer 来允许映射私有属性到数据库列。然后,我有一些类似于你的代码,除了 getters 和 setters 是相反的:
[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; }
}
我使用 DB2TimeStamp
class 来处理字符串和 DateTime 值之间的转换,但是您可以根据自己的喜好进行转换。
您可以使用MappingSchema.SetConverter方法在客户端设置特定类型之间的转换。或 MappingSchema.SetConverter创建转换器作为查询树的一部分的表达式。
在我们必须使用的数据库(即 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。不过,也许它仍然会给你一些想法。
我之前使用 Entity Framework 所做的(虽然不是专门针对 DB2,但我认为它应该仍然有效),是使用提供的代码 in this answer 来允许映射私有属性到数据库列。然后,我有一些类似于你的代码,除了 getters 和 setters 是相反的:
[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; }
}
我使用 DB2TimeStamp
class 来处理字符串和 DateTime 值之间的转换,但是您可以根据自己的喜好进行转换。
您可以使用MappingSchema.SetConverter方法在客户端设置特定类型之间的转换。或 MappingSchema.SetConverter创建转换器作为查询树的一部分的表达式。