dotnet data_error ai_generated true

System.InvalidOperationException: LINQ 表达式 'x => x.SomeMethod()' 无法转换。请重写查询为可转换的形式,或通过插入对 'AsEnumerable'、'AsAsyncEnumerable'、'ToList' 或 'ToListAsync' 的调用来显式切换到客户端评估。

System.InvalidOperationException: The LINQ expression 'x => x.SomeMethod()' 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'.

ID: dotnet/ef-core-translation-failure

其他格式: JSON · Markdown 中文 · English
85%修复率
85%置信度
1证据数
2023-05-10首次发现

版本兼容性

版本状态引入弃用备注
net6.0 active
net7.0 active
net8.0 active
net9.0 active

根因分析

EF Core 无法将 LINQ 方法调用(例如自定义方法、未映射类型上的 ToString)转换为 SQL,因为它没有对应的 SQL 函数或映射。

English

EF Core cannot translate a LINQ method call (e.g., custom methods, ToString on non-mapped types) into SQL, because it lacks a corresponding SQL function or mapping.

generic

官方文档

https://learn.microsoft.com/en-us/ef/core/querying/client-eval

解决方案

  1. Rewrite the query to use translatable constructs. For example, replace '.Where(x => x.CustomMethod() == value)' with '.Where(x => x.Property == value)' if CustomMethod just accesses a property. If using ToString, use 'SqlFunctions.StringConvert' for numeric types or 'EF.Functions.DateDiff' for dates.
  2. Use client evaluation explicitly by calling .AsEnumerable() or .ToList() before the non-translatable part. Example: 'var results = context.Entities.Where(e => e.IsActive).AsEnumerable().Where(e => e.CustomMethod() == true).ToList();'
  3. Register a custom queryable function using 'HasDbFunction' in OnModelCreating. Example: 'modelBuilder.HasDbFunction(() => MyDbContext.ConvertToUpper(default))' and map it to a SQL function like 'UPPER'.

无效尝试

常见但无效的做法:

  1. Adding .AsEnumerable() before the problematic method call without understanding which part causes the issue 75% 失败

    AsEnumerable() forces client evaluation for the entire query, which may work but can cause performance issues and does not fix the root cause if the method is used multiple times.

  2. Using .Select() with a lambda that calls ToString() on a non-string property expecting EF Core to translate it 85% 失败

    ToString() is not translatable for many types (e.g., decimal, DateTime) in older EF Core versions; it requires a specific SQL function like CAST or FORMAT.

  3. Changing the method to be static and assuming EF Core will recognize it 90% 失败

    EF Core does not automatically translate custom static methods; they must be registered as queryable functions or converted to translatable expressions.