获取“无法翻译要么以可以翻译的形式重写查询”,.NET Corel 中的异常

问题描述

我正在开发一个 C# 应用程序。我必须创建一个谓词来过滤数据。我有一个模型类 TissueItem,它有一个名为 ExpirationData属性。我必须从 TissueItem 获取该数据,其中到期日期小于或等于指定的数字。我的谓词表达式是:

ExpressionStarter<TissueItem> predicate = PredicateBuilder.New<TissueItem>();
predicate = predicate.And(x => 
    Convert.ToInt32((x.ExpirationDate.Value - DateTime.Today).TotalDays) 
       <= inventorySearchFilterModel.ExpirationStatus);

当我通过此谓词获取数据时,出现以下异常:

The LINQ expression 'DbSet<TissueItem>()
    .Where(t => Convert.ToInt32((t.ExpirationDate.Value - DateTime.Today).TotalDays) <= __inventorySearchFilterModel_ExpirationStatus_0)' 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 'AsEnumerable','AsAsyncEnumerable','ToList',or 'ToListAsync'.

可能的问题是什么。我使用的是 .NET Core 3.1。

解决方法

试试这个变体。看起来 EFC 不处理 Timestamp.TotalDays

var predicate = PredicateBuilder.New<TissueItem>();
predicate = predicate.And(x => 
    EF.Functions.DateDiffDay(x.ExpirationDate.Value,DateTime.Today) 
       <= inventorySearchFilterModel.ExpirationStatus);