【问题标题】:Orderby could not be translated. Either rewrite the query in a form that can be translatedOrderby 无法翻译。以可以翻译的形式重写查询
【发布时间】:2021-11-22 22:13:18
【问题描述】:

我尝试在Linq 查询中使用 Orderby,但出现以下错误:

.OrderBy(p => p.Name)' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估

产品.cs

public string Name =>
      NameTranslations?.FirstOrDefault( nt => nt.LanguageCode == LanguageCode.UK )?.Value;
public List<Translation> NameTranslations { get; set; }

所以当我尝试使用以下代码时,我得到一个错误:

var result = _db.Products.OrderBy( x => x.name);
//some logic to change resultQuery

我不想带入内存并使用OrderBy,因为我有一些逻辑要更改我的IQueryable

顺便加一下代码就可以解决,但是我不想这样用

.OrderBy( x => x.NameTranslations.FirstOrDefault( nt => nt.LanguageCode == LanguageCode.UK)
                                                     .Value)

【问题讨论】:

  • 看起来Name 是一个未映射的属性,它返回此x.NameTranslations.FirstOrDefault...。 EF 无法将其转换为 SQL,因此您必须像在最后一个代码片段中那样进行操作。

标签: c# sql-server linq


【解决方案1】:

正如 Gert 所说,您不能在 linq-to-sql 中使用计算的未映射属性。

如果您不想每次都使用长表达式,您可以为其创建一个静态属性,如下所示:

public static Expression<Func<Products, string>> UkLangName =>
   Products => Products.NameTranslations.FirstOrDefault(x => x.LanguageCode == LanguageCode.UK);

那么当你想使用它时,你可以这样做:

.OrderBy(UkLangName)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2021-10-14
    相关资源
    最近更新 更多