【问题标题】:Getting "could not be translated. Either rewrite the query in a form that can be translated", exception in .NET Corel获取“无法翻译。要么以可翻译的形式重写查询”,.NET Corel 中的异常
【发布时间】:2021-01-21 06:07:23
【问题描述】:

我正在开发一个 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。

【问题讨论】:

标签: c# .net-core entity-framework-core predicate


【解决方案1】:

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

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

【讨论】:

  • 已经试过了。它仍然无法正常工作。 . .通过异常消息,我认为此功能无法在 EF 级别实现。从数据库(在客户端)@Svyatoslav Danyliv 接收数据后可能必须应用日期过滤器 ..。我不确定这个客户端过滤,这只是我到目前为止所理解的。
  • 它应该可以工作。可能你没有展示整个场景。尝试不使用 PredicateBuilder。
猜你喜欢
  • 2021-11-22
  • 1970-01-01
  • 2020-05-21
  • 1970-01-01
  • 2021-10-13
  • 2021-10-14
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
相关资源
最近更新 更多