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

Posted

技术标签:

【中文标题】Linq2DB 无法翻译 Where 子句中的映射列【英文标题】:Linq2DB can't translate a mapped column in Where clause 【发布时间】:2021-03-16 08:56:07 【问题描述】:

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

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

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

ConvertToBoolean & ConvertToChar 只是类型之间映射的函数。

这是字段:

    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 并导致错误

p>

ORA-01722: invalid number

有什么办法可以处理这种情况吗?我希望生成的 SQL 使用指定的 Where 子句检查 HAS_DOG = 'Y' :)

备注

我这里没有使用EntityFramework,这个查询所在的应用模块没有使用EF/EFCore

【问题讨论】:

【参考方案1】:

您可以为您的特定 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时使用

【讨论】:

我重新看了你的回答,你这里指的是EntityFramework映射吗? 不,此功能在linq2db 中可用。我已经亲自开发了;) PogChamp - 立即尝试。 我的代码是否需要删除?我似乎仍然遇到同样的问题 可能会删除MappingSchema.Default.SetConverter&lt;char, bool&gt;(ConvertToBoolean); ...。但请确保将映射模式传递给DataConnection。如果仍有问题,请尝试准备小样本并在linq2db 中创建问题。

以上是关于Linq2DB 无法翻译 Where 子句中的映射列的主要内容,如果未能解决你的问题,请参考以下文章

where 子句中的日期时间条件无法正常工作

无法找出复杂子句中的 PSQL where 问题

将 IQueryable where 子句从 DTO 映射到实体

查询中的 WHERE 子句在 CodeIgniter 3 中无法正常工作

Django ORM 是不是在 sql where 子句中将已删除的字段映射到其他字段之前?

无法执行 SELECT Login_Name FROM memberdirectory WHERE Login_Name = saviobosco(1054)“where 子句”中的未知列“savio