【问题标题】:Translation exception difference in EF Core's different Linq queriesEF Core 的不同 Linq 查询中的翻译异常差异
【发布时间】:2020-07-31 09:39:57
【问题描述】:

我在一个项目中使用了 EF Core 3.1 和 SQL Server 2017。在存储库方法中,我需要使用以下条件获取最后一行:

var response = await _queryableDbSet.LastOrDefaultAsync(file =>
           (file.OriginalFileName + "." + file.Extension).ToLower() == fileName.ToLower());

但是上面提到的代码抛出了这个异常:

“无法翻译 LINQ 表达式 'DbSet\n .Where(f => (f.OriginalFileName + "." + f.Extension).ToLower() == __ToLower_0)\n .LastOrDefault()'。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。

通过将查询更改为基于这样的简单 where 子句:

var response = await _queryableDbSet.Where(file => 
          (file.OriginalFileName + "." + file.Extension).ToLower() == fileName.ToLower())
     .OrderByDescending(x => x.CreatedAt)
     .Take(1)
     .SingleOrDefaultAsync();

一切正常。 我认为查询翻译的概念我知道,但我不知道为什么同一个库的不同方法会导致不同的结果。

任何帮助将不胜感激。

【问题讨论】:

  • SQL 比较已经不区分大小写*。没有必要(事实上这很危险)在 where 子句中转换为小写。
  • SQL 没有 LAST 概念。因此,我们使用降序取第一个。

标签: c# linq linq-to-entities ef-core-3.1


【解决方案1】:

会避免在.Where 子句中出现任何“复杂”的情况。最好进行简单的比较(Linq 可以轻松翻译)。

var searchFileName = Path.GetFileNameWithoutExtension(fileName);
var searchFileExtension = Path.GetExtension(fileName);
var response = await _queryableDbSet.Where(file => 
      file.OriginalFileName == searchFileName && 
      file.Extension==searchFileExtension);

但是,正如@donggas90 指出的那样,.LastOrDefault 可能是您的问题。

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2020-03-11
    • 2016-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多