EF Core 3.0 Linq 十进制比较(大于或小于)不起作用 - 无法翻译

EF Core 3.0 Linq decimal compare (Greater or Less than) not working - could not be translated

这个曾经在 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 : The LINQ expression 'DbSet .Where(p => p.StartTime < 1)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync()

首先,在 EF Core 1.x / 2.x 中“工作”而不在 EF Core 3.x+ 中工作只是意味着表达式在客户端上被静默计算,现在失败了因为 EF Core 3.0 删除了隐式客户端评估并要求您使用异常消息建议的选项显式解析它们。

其次,这里的实际问题是您似乎在使用 SQLite 并访问了其中一个 EF Core Query limitations

SQLite doesn't natively support the following data types. EF Core can read and write values of these types, and querying for equality (where e.Property == value) is also supported. Other operations, however, like comparison and ordering will require evaluation on the client.

  • DateTimeOffset
  • Decimal
  • TimeSpan
  • UInt64

对于 decimal,您可以使用同一 link(官方 EF Core 文档)中的建议,通过更改 属性 类型或将其映射为 double使用 value converter,例如

if (Database.IsSqlite())
{
    modelBuilder.Entity<Shift().Property(e => e.StartTime).HasConversion<double>();
    modelBuilder.Entity<Shift().Property(e => e.EndTime).HasConversion<double>();
}