EF Core 3.0 Linq十进制比较(大于或小于)不起作用-无法翻译 [英] EF Core 3.0 Linq decimal compare (Greater or Less than) not working - could not be translated
本文介绍了EF Core 3.0 Linq十进制比较(大于或小于)不起作用-无法翻译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
var qry = from p in ctx.Shifts where p.StartTime < 1
select p;
var list = qry.ToList(); //This fails
请注意,";>;";和";<;";都不起作用,但";=";起作用。
对象如下所示
public class Shift
{
public decimal StartTime {get;set;}
public decimal EndTime {get;set;}
}
我收到错误:
System.InvalidOperationException:LINQ表达式‘DbSet .Where(p=>;p.StartTime<;1)‘无法翻译。以可以翻译的形式重写查询,或者切换到 通过插入对以下任一项的调用来显式进行客户端评估 AsEnumerable()、AsAsyncEnumerable()、ToList()或ToListAsync()
推荐答案
首先,在EF Core1.x/2.x中使用";Working";而在EF Core3.x+中不使用,只是表示表达式在客户机上以静默方式计算,现在失败,因为EF Core3.0删除了隐式客户端评估,并要求您使用异常消息中建议的选项显式解决这些问题。
第二,这里的实际问题是您似乎正在使用SQLite,并且击中了它的一个EF核心Query limitations:
SQLite本身不支持以下数据类型。EF Core可以读写这些类型的值,也支持查询相等(
where e.Property == value
)。但是,其他操作(如比较和排序)将需要在客户端上进行评估。
- DateTimeOffset
- 小数
- 时间跨度
- UInt64
对于decimal
,您可以使用同一链接(EF核心官方文档)中的建议,通过更改属性类型或使用value converter将其映射为double
,例如
if (Database.IsSqlite())
{
modelBuilder.Entity<Shift().Property(e => e.StartTime).HasConversion<double>();
modelBuilder.Entity<Shift().Property(e => e.EndTime).HasConversion<double>();
}
这篇关于EF Core 3.0 Linq十进制比较(大于或小于)不起作用-无法翻译的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文