EF Core 3.0 Linq十进制比较(大于或小于)不起作用-无法翻译 [英] EF Core 3.0 Linq decimal compare (Greater or Less than) not working - could not be translated

查看:37
本文介绍了EF Core 3.0 Linq十进制比较(大于或小于)不起作用-无法翻译的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这个过去在2.2中起作用的简单语句在3.1中不再起作用。 我收到错误:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆