如何获取从 EF Core 查询返回的每种类型之一

Qua*_*023 6 c# sql-server asp.net asp.net-web-api entity-framework-core

我正在尝试获取按 desc 订购的客户的每种类型笔记之一的列表。在 SQL Server 中,我编写了以下查询

SELECT  
    note_id, st_id, note_type, signature_date 
FROM 
    (SELECT
         note_id, st_id, note_type, signature_date
         ROW_NUMBER() OVER (PARTITION BY note_type ORDER BY signature_dateDESC) AS row_num
     FROM 
         notes_log
     WHERE 
         cl_id = 1
         AND svce_type = 'service type 1'
         AND (note_type = 'note type 1' OR note_type = 'note type 2' OR note_type = 'note type 3')
     ) AS subquery
WHERE row_num = 1
ORDER BY signature_date DESC;
Run Code Online (Sandbox Code Playgroud)

这个查询工作正常,但是当将上面的查询转换为 Linq 时,我遇到了一些错误。这就是我所做的

 var lastNotes = await dbContext.Set<NotesLog>()
            .Where(s => s.ClientId == id && s.ServiceType == serviceType && (s.NoteType == "type 1" || s.NoteType == "type 2" || s.NoteType == "type 3"))
            .OrderByDescending(s => s.Signaturedate)
            .GroupBy(s => s.NoteType)
            .SelectMany(group => group.Take(1))
            .Select(s => new
            {
                s.NoteId,
                s.StateId,
                s.NoteType,
                s.Signaturedate
            })
            .ToListAsync();
Run Code Online (Sandbox Code Playgroud)

我还尝试将 GroupBy 和 Selectmany 交换为.DistinctBy(s => s.NoteType)

他们都返回了类似的错误

无法翻译。以可翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端计算。

我知道我可以先获取所有笔记,然后查询列表以获取我需要的内容(我在网上找到了一些此类解决方案),但这样做对我来说没有多大意义。那么有没有更好的方法呢?

编辑我能够拼凑出一个解决方案(见下文),其中我得到每组一个的正确结果,但顺序不一致,而且似乎根本没有按降序排列。我正在寻找的是按降序排列的正确结果

提前致谢

rot*_*bor 2

您有多种选择:

  1. 由于您已经编写了 SQL 查询,因此您可以在记录集上执行它,而不必使用 Linq。
  2. 您可以划分 Linq 查询并估计中间数据量。如果可以接受的话可以按照这种方式处理。
  3. 我没有对你的 Linq 表达式考虑太多,而是尝试使用“第一个”方法。

在Linq 查询分组依据和选择第一项中查找更多信息