迁移到.net core 3.1后EF OrderBy出现问题

2024-03-14

考虑这段代码:

_dbContext.Messages
    .GroupBy(m => new
        {
            MinId = m.SenderId <= m.RecipientId ? m.SenderId : m.RecipientId,
            MaxId = m.SenderId > m.RecipientId ? m.SenderId : m.RecipientId
        })
        .Select(gm => gm.OrderByDescending(m => m.SentAt).FirstOrDefault());

这样,无论消息是谁发送的,我都会按用户的 ID 对所有对话进行分组。然后,我按组内的 SentAt 日期对消息进行排序,并从每个对话中选择最后一条消息。 问题是这段代码可以工作,而且它把所有的代码都翻译成纯 T-Sql(我使用 SQL Server Profiler 来检查)。但后来我决定将我的项目从 Core 2.1 迁移到 3.1,现在我得到了:

LINQ 表达式 '(GroupByShaperExpression: KeySelector:

new { 
    MinId = (CASE
        WHEN ((m.SenderId) <= (m.RecipientId)) THEN (m.SenderId)
        ELSE (m.RecipientId)
    END), 
    MaxId = (CASE
        WHEN ((m.SenderId) > (m.RecipientId)) THEN (m.SenderId)
        ELSE (m.RecipientId)
    END)
 }, 
ElementSelector:(EntityShaperExpression: 
    EntityType: Message
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
)
).OrderByDescending(m => m.SentAt)

无法翻译。要么以可以的形式重写查询 被翻译,或通过插入显式切换到客户评估 调用 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()。看https://go.microsoft.com/fwlink/?linkid=2101038 https://go.microsoft.com/fwlink/?linkid=2101038为了 更多信息。

任何解决这个问题的想法将不胜感激。

附:我知道我可以深入研究 T-SQL 并为其编写存储过程,但我仍在寻找一种使用 Linq to Entity 实现它的方法。


不幸的是,目前 EF Core 3.0 / 3.1 仅支持服务器翻译GroupBy具有键/聚合的投影(类似于 SQL)。

这是不可接受的,因为尽管 EF6 也没有客户端评估,但它能够成功翻译此类查询。

直到GroupBy翻译问题得到解决,解决方法是替换GroupBy有 2 个相关子查询 - 第一个仅包含分组键,第二个包含组元素。

在你的情况下,它会是这样的:

var source = _dbContext.Messages
    .Select(m => new
    {
        Key = new
        {
            MinId = m.SenderId <= m.RecipientId ? m.SenderId : m.RecipientId,
            MaxId = m.SenderId > m.RecipientId ? m.SenderId : m.RecipientId
        },
        Message = m
    });

var query = source.Select(e => e.Key).Distinct()
    .SelectMany(key => source
        .Where(e => e.Key.MinId == key.MinId && e.Key.MaxId == key.MaxId)
        .Select(e => e.Message)
        .OrderByDescending(m => m.SentAt)
        .Take(1));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迁移到.net core 3.1后EF OrderBy出现问题 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • fgets() 和 Ctrl+D,三次才能结束?

    I don t understand why I need press Ctrl D for three times to send the EOF In addition if I press Enter then it only too
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • C++ 成员函数中的“if (!this)”有多糟糕?

    如果我遇到旧代码if this return 在应用程序中 这种风险有多严重 它是一个危险的定时炸弹 需要立即在应用程序范围内进行搜索和销毁工作 还是更像是一种可以悄悄留在原处的代码气味 我不打算writing当然 执行此操作的代码 相反

随机推荐

  • JPA CriteriaBuilder 将合取条件转换为析取条件

    我需要将此查询复制到JPA 标准生成器 code where article client id 1 and article price gt 0 and article code like this is statement or art
  • Windows批处理:睡眠[重复]

    这个问题在这里已经有答案了 如何让 Windows 批处理脚本等待几秒钟 sleep and wait似乎不起作用 无法识别的命令 你可以试试 ping n XXX 127 0 0 1 gt nul 其中 XXX 是等待的秒数加一
  • JPA CriteriaQuery 计算用于 where 谓词的日期时间差

    我正在尝试从数据库中选择两个字段之间的时间差小于或大于某个值的实体 在标准 SQL 中 这可以使用 TIMESTAMPDIFF 函数简单地完成 SELECT from run where TIMESTAMPDIFF SECOND run e
  • numpy 将 RGB 图像转换为 YIQ 颜色空间

    对于一个类 我需要将 RGB 图像转换为 YIQ 我们被告知可以通过以下方式进行转换 我开始编写一个带有循环的凌乱代码来进行矩阵乘法 然后我发现了一个函数 skimage color yiq2rgb imYIQ 当我往里面看他们在做什么时
  • JavaFX 8 日期选择器功能

    我刚刚开始使用新的 JavaFX 8 控件DatePicker In DatePicker 用户体验文档 https wiki openjdk java net display OpenJFX DatePicker User Experie
  • 动态增加列表视图中的元素数量

    我想增加列表视图滚动到末尾时动态显示的项目数量 就我而言 我的列表视图最初将显示 10 个项目 然后 当我们滚动到最后一个项目时 它必须开始显示另外 10 个项目 依此类推 我怎样才能做到这一点 这是我的自定义阵列适配器 package c
  • 无法理解“选项卡”。

    我正在读 C 编程语言 我无法理解第 34 页的练习 1 20 编写一个程序 detab 用适当数量的空格替换输入中的制表符 以分隔到下一个制表位 假设有一组固定的制表位 例如每 n 列 n 应该是变量还是符号参数 第二句话我不明白 让我们
  • Apple Watch 应用程序的 Xcode 7 安装从未完成

    我想尝试一下新的 Apple Watch OS2 打开我现有的项目 添加了目标 更改了捆绑包标识符以删除错误消息 手表应用程序永远不会启动 大约 5 分钟后 我在 Xcode 中收到此错误消息 我还没有添加任何 Swift 代码 我所做的就
  • ZipPackage 类与 Zipfile 类

    我对这两个类感到困惑 它们似乎都用于创建或提取 zip 文件 谁能解释其中的区别吗 ZipPackage Class 实现抽象 Package 基类的派生子类 ZipPackage 类使用 ZIP 存档作为容器存储 这个类不能被继承 Zip
  • DatagridView 如何让每列有不同的行数?

    所以我试图以特定格式显示我的数据datagridview 所以我的格式是这样的 A B C 1 1 1 2 2 x 3 x x x 表示没有单元格 正如您所看到的 每列都有不同的行数 我想在 DatagridView 或 Dot Net F
  • 如何修复错误 - 创建新 Google 表格时参数无效:file.contentType

    我正在尝试在已创建的文件夹中创建新的 Google 表格 但内容类型存在问题 我已经搜索过这个错误 但没有找到任何东西 大多数搜索都会出现MimeType错误 但我不认为这是问题所在 下面是我正在使用的代码 var ss Spreadshe
  • 处理本地化字符串包含单个 TextView 中的链接

    我的 strings xml 文件中有一个字符串 单击该字符串的某些部分会重定向到任务 该部分是根据字符串的索引制作的 现在我正在尝试将其翻译为法语 但我遇到了索引越界异常 因为它的长度小于英语字符串的长度 谁能说一下 处理这种情况的最佳方
  • 如何在Python中调用带有两个参数的函数

    我想问一下如何在 python 中调用带有两个参数的函数 例如 下面的代码是我想调用颜色函数的示例 def color object return 033 1 34m object 033 1 m tes this must be blue
  • 没有公钥的 EF 实体

    我想在 EF 中创建一个没有公钥的实体 支持表具有非唯一的聚集键 但表中的数据从概念上讲没有可以使用的唯一主键 看来EF确实不喜欢这样 有没有什么方法可以让 EF 接受该表没有主键并使其可以使用它 而不会影响性能 我不在乎结果是否是只读的
  • 当 php://temp 多次打开时会发生什么?

    If the php temp or php memory 文件被打开多次 句柄是否会指向同一个文件 或者每个手柄都是独一无二的 我在 php 文档中找不到答案 所以我要去编写一个测试脚本来找出答案 https stackoverflow
  • 将新 ns 映射到旧 ns

    我将 Android Studio 更新到 4 2 1 并删除了 jcentor 在构建项目时出现了这样的警告 我不明白这些 URL 的含义以及如何修复它 映射新的nshttp schemas android com repository
  • Flask 在文件上传时出现错误 400

    我有以下内容
  • 如何在我的发布 aar 中打包多个 AAR

    我们向客户发送 android sdk aar 文件 我们的代码在内部使用我们的存储库中的两个第三方 aar 并且 gradle 在运行时引用它 我的问题是如何将这些依赖项发送给客户 就好像如果我不想给他们那些第 3 方 aar 我怎样才能
  • 如何通过闪亮的按钮动态添加/删除输入字段

    我一直在尝试找到一种解决方案 如何使用闪亮的按钮添加和删除输入字段 我没有源代码 因为我还没有取得太大进展 但是这个 jQuery 示例 http www mkyong com jquery how to add remove textbo
  • 迁移到.net core 3.1后EF OrderBy出现问题

    考虑这段代码 dbContext Messages GroupBy m gt new MinId m SenderId lt m RecipientId m SenderId m RecipientId MaxId m SenderId g