EF Core的不同Linq查询中的翻译例外差异

时间:2020-07-31 09:39:57

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

我在一个项目中使用了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();

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

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

I 会避免在.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才是您的问题。