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 并导致错误
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<char, bool>(ConvertToBoolean); ...
。但请确保将映射模式传递给DataConnection
。如果仍有问题,请尝试准备小样本并在linq2db
中创建问题。以上是关于Linq2DB 无法翻译 Where 子句中的映射列的主要内容,如果未能解决你的问题,请参考以下文章
将 IQueryable where 子句从 DTO 映射到实体
查询中的 WHERE 子句在 CodeIgniter 3 中无法正常工作
Django ORM 是不是在 sql where 子句中将已删除的字段映射到其他字段之前?
无法执行 SELECT Login_Name FROM memberdirectory WHERE Login_Name = saviobosco(1054)“where 子句”中的未知列“savio