微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linq2DB 无法翻译 Where 子句中的映射列

如何解决Linq2DB 无法翻译 Where 子句中的映射列

我正在使用旧版 Oracle 数据库,该数据库在表上有一列,该列将布尔值存储为“Y”或“N”字符。

我已经像这样映射/转换了这个列:

MappingSchema.Default.SetConverter<char,bool>(ConvertToBoolean);
MappingSchema.Default.SetConverter<bool,char>(Converttochar);

ConvertToBooleanConverttochar 只是在类型之间映射的函数

这里是字段:

    private char hasDog;
        
    [Column("HAS_DOG")]
    public bool HasDog
    {
        get => ConvertToBoolean(hasDog);
        set => hasDog = Converttochar(value);
    }

这对于简单地检索数据很有效,但是,似乎是以下内容的翻译:

var humanQuery = (from human in database.Humans
                            join vetVisit in database.VetVisits on human.Identifier equals vetVisit.Identifier
                            select new HumanModel(
                               human.Identifier
                               human.Name,human.HasDog,vetVisit.Date,vetVisit.Year,vetVisit.PaymentDue
                                ));

// humanQuery is filtered by year here

            var query = from vetVisits in database.VetVisits
                        select new VetPaymentModel(
                            (humanQuery).First().Year,(humanQuery).Where(q => q.HasDog).Sum(q => q.PaymentDue),-- These 2 lines aren't correctly translated to Y/N
                            (humanQuery).Where(q => !q.HasDog).Sum(q => q.PaymentDue)
                            );

如上所述,此处的 .Where 子句不会将 HasDog 为真/假的布尔比较转换为相关的 Y/N 值,而是转换为 0/1 并导致错误

ora-01722: invalid number

有没有办法处理这种情况?我希望生成sql 使用指定的 Where 子句来检查 HAS_DOG = 'Y' :)

注意事项

  • 在这里没有使用 EntityFramework,此查询所在的应用程序模块没有使用 EF/EFCore

解决方法

您可以为您的特定 DataConnection 定义新的映射架构:

var ms = new MappingSchema();
builder = ms.GetFluentMappingBuilder();

builder.Entity<Human>()
    .Property(e => e.HasDog)
    .HasConversion(v => v ? 'Y' : 'N',p => p == 'Y');

创建此架构 ONCE 并在创建 DataConnection

时使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。