sqlite Linq2DB将属性Map到SQL函数的结果

watbbzwu  于 2023-03-23  发布在  SQLite
关注(0)|答案(1)|浏览(122)

我有SQLite数据库与表报告。

CREATE TABLE IF NOT EXISTS Reports (
    Id          INTEGER PRIMARY KEY AUTOINCREMENT,
    ReportName  TEXT NOT NULL UNIQUE,
    CreatedAt   REAL NOT NULL
)

它包含列CreatedAt,日期存储为自公元前4714年11月24日以来的天数的分数(julianday

INSERT INTO Reports (ReportName, CreatedAt) VALUES ('Report1', julianday('2023-03-19 13:10:43.254'))

当我需要取回DateTime值时,我需要使用函数strftime。

SELECT 
    ReportName, 
    strftime('%Y-%m-%d %H:%M:%f', CreatedAt) as CreatedAt
FROM Reports
WHERE Id = 123

是否可以创建POCO类并使用Linq2DB将其Map到该表?

public class Report 
{
    public long Id { get; set; }
    public string ReportName { get; set; }
    public DateTime CreatedAt { get; set; }
}

public class ReportsContext : DataConnection 
{
    public ITable<Report> Reports => this.GetTable<Report>();
}

我知道我可以使用ExpressionMethodAttribute并使用LINQ表达式将任何属性Map到计算值,但在这种情况下,当从DB阅读和写入数据库时,我需要调用不同的SQL函数。

ih99xse1

ih99xse11#

我找到了解决办法

public static class JulianDayExtensions
{
    private const double ConstValue = 2415018.5;

    public static double ToJulianDay(this DateTime value) => value.ToOADate() + ConstValue;

    public static DateTime FromJulianDay(this double value) => DateTime.FromOADate(value - ConstValue);
}

然后我使用流畅的Map

private static void BuildReport(EntityMappingBuilder<Report> entityBuilder)
{
    entityBuilder.HasTableName("Reports");

    entityBuilder
        .Property(x => x.Id)
        .HasColumnName("Id")
        .IsPrimaryKey()
        .IsIdentity();

    entityBuilder
        .Property(x => x.ReportName)
        .HasColumnName("ReportName");

    entityBuilder
        .Property(x => x.CreatedAt)
        .HasColumnName("CreatedAt")
        .HasConversionFunc(x => x.ToJulianDay(), x => x.FromJulianDay());
}

类Report很简单

public class Report
{
    public long Id { get; set; }
    public string ReportName { get; set; } = null!;
    public DateTime CreatedAt { get; set; }
}

相关问题