【发布时间】: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