EF 3.1:克服 LINQ GroupBy SQL 转换问题 [重复]

2023-12-31

在 MS SQL Server 中,我有一个表,其中包含联系人呼叫历史记录(这是另一个表)。 由 EF 访问的实体如下:

public partial class CallbackHistory
{
    public int HistoryId { get; set; }
    public int CompanyId { get; set; }
    public int CallerId { get; set; }
    public DateTime LastCallTimeStamp { get; set; }

    public virtual CompanyDiary Caller { get; set; }
    public virtual Company Company { get; set; }
}

and

public partial class CompanyDiary
{
    public CompanyDiary()
    {
        DatiCallbackHistory = new HashSet<DatiCallbackHistory>();
    }
    public int CallerId { get; set; }
    public string NickName { get; set; }
    public string PhoneNumber { get; set; }
    public string Email { get; set; }
    public int CompanyId { get; set; }

    public virtual Company Company { get; set; }
    public virtual ICollection<CallbackHistory> CallbackHistory { get; set; }
}

我需要获取按日期降序排列的最后 5 次对个人号码的呼叫的列表。

不幸的是,我提出了以下无法转换为 SQL 的查询:

var historyOfCalls = await
                    context.CallbackHistoryDbSet
                    .Include(historyEntry => historyEntry.Caller)
                    .Where(historyEntry => historyEntry.CompanyId == companyId)
                    .GroupBy(s => s.Caller.PhoneNumber)
                    .Select(s => s.OrderByDescending(historyEntry => historyEntry.LastCallTimeStamp).FirstOrDefault())
                    .Take(5)
                    .AsNoTracking()
                    .ToListAsync(cancellationToken).ConfigureAwait(false);

这是我得到的错误:

System.AggregateException
  HResult=0x80131500
  Message=One or more errors occurred. (The LINQ expression '(GroupByShaperExpression:
KeySelector: (c.PhoneNumber), 
ElementSelector:(EntityShaperExpression: 
    EntityType: CallbackHistory
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
)
)
    .OrderByDescending(historyEntry => historyEntry.LastCallTimeStamp)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.)
  Source=System.Private.CoreLib

Inner Exception 1:
InvalidOperationException: The LINQ expression '(GroupByShaperExpression:
KeySelector: (c.PhoneNumber), 
ElementSelector:(EntityShaperExpression: 
    EntityType: CallbackHistory
    ValueBufferExpression: 
        (ProjectionBindingExpression: EmptyProjectionMember)
    IsNullable: False
)
)
    .OrderByDescending(historyEntry => historyEntry.LastCallTimeStamp)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

看来问题在于我正在对导航属性进行分组。

我可以重写此查询以使其可转换为 SQL 吗?

我不知道什么时候切换到Linq 到对象 https://learn.microsoft.com/en-us/ef/core/what-is-new/ef-core-3.0/#restricted-client-evaluation有了这个查询,因为我已经打电话给ToListAsync。之后我尝试移动它Select在查询中但它不编译


在查询中较早调用 ToListAsync 将导致所有其他 linq 语句无法编译,因为 ToListAsync 将返回一个 Task,因此本质上您需要首先等待结果或调用 .Result (这将阻塞当前线程)。我的建议是将查询拆分为:

  1. 获取数据
  2. 投影数据

e.g.

    var historyOfCalls = await context.CallbackHistoryDbSet
        .Include(historyEntry => historyEntry.Caller)
        .Where(historyEntry => historyEntry.CompanyId == companyId)
        .AsNoTracking()
        .ToListAsync(cancellationToken).ConfigureAwait(false);

    var projection = historyOfCalls 
        .GroupBy(s => s.Caller.PhoneNumber);

请记住,通过调用 group by 您将获得一个 Grouping,因此当调用 Select 时您将拥有一个 Key 属性(电话号码)和 value 属性。我建议通过使用调用者 DbSet 来反转您的查询并包含其调用者历史记录,然后从那里进行分组并使用 group by 上的一些重载来选择将值更正到 TV 中。

    var callers = await context.CompanyDiaryDbSet
        .Include(c => c.CallbackHistory)
        .Where(c=> c.CompanyId == companyId)
        .AsNoTracking()
        .ToListAsync(cancellationToken).ConfigureAwait(false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF 3.1:克服 LINQ GroupBy SQL 转换问题 [重复] 的相关文章

  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 使用实体框架从集合中删除项目

    我正在使用DDD 我有一个 Product 类 它是一个聚合根 public class Product IAggregateRoot public virtual ICollection
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • 范围和临时初始化列表

    我试图将我认为是纯右值的内容传递到范围适配器闭包对象中 除非我将名称绑定到初始值设定项列表并使其成为左值 否则它不会编译 这里发生了什么 include
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • UWP 无法在两个应用程序之间创建本地主机连接

    我正在尝试在两个 UWP 应用程序之间设置 TCP 连接 当服务器和客户端在同一个应用程序中运行时 它可以正常工作 但是 当我将服务器部分移动到一个应用程序并将客户端部分移动到另一个应用程序时 ConnectAsync 会引发异常 服务器未
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens
  • 如何使用 std::array 模拟 C 数组初始化“int arr[] = { e1, e2, e3, ... }”行为?

    注意 这个问题是关于不必指定元素数量并且仍然允许直接初始化嵌套类型 这个问题 https stackoverflow com questions 6111565 now that we have stdarray what uses are

随机推荐

  • 记忆库模式和单元测试

    我已经看到了存储库模式的一些实现 非常简单直观 链接到 stackoverflow 中的其他答案 http www codeproject com Tips 309753 Repository Pattern with Entity Fra
  • VSTS 更改时区

    更改 VSTS 中的全球时区是否会影响现有任务 或者它只是一个显示选项 有一位客户正在考虑改变这一点 但担心这是否会影响现有项目 VSTS中有两个不同的时区 VSTS 帐户时区 VSTS 用户配置文件时区 VSTS 账户 TZ 在问题中 您
  • nltk-hook 无法找到 nltk_data

    当使用 pyinstaller 构建可执行文件时 我得到 无法找到 home usr nltk data 添加二进制文件和数据文件时 我几乎尝试了互联网上的所有解决方案 将 hook nltk py 文件更改为此 import os imp
  • 跳过(完整)暂存区域并直接提交文件或补丁?

    想象一下这样的场景 您正在开发一个需要接触大量文件的功能 并且您已经暂存了很多事情 还有很多未暂存的事情 例如调试代码 为自己记住要做的临时注释 撤消某些事情 并且不要忘记添加您还没有时间添加的位 然后您会看到必须进行的简单一行更改 但该更
  • 从 CSV 文件中去除空格

    我需要从我读取的 CSV 文件中去除空格 import csv aList with open self filename r as f reader csv reader f delimiter quoting csv QUOTE NON
  • 为什么我的 gradle 任务在构建期间执行时被跳过?

    我目前正在将应用程序从 Maven 迁移到 gradle 4 10 2 在 Maven 中 将生成一个 tar gz 文件 其中包含配置 依赖项和一些空目录 然后应用程序在运行时将使用这些目录 在 gradle 中 我使用分发插件通过 di
  • 如何使组合框下拉列表比组合框本身*窄*

    是否可以使 ComboBox 下拉列表成为Narrower比组合框本身 有很多使用设置宽度的示例SendMessage Handle CB SETDROPPEDWIDTH 100 200 but the minimum无论此处指定什么 值均
  • BDE、Windows 7 和 UAC

    我有一个用 delphi 5 编写的非常旧的应用程序 在一些使用 BDE 的客户中运行 现在 一些使用 Windows Vista 和 7 的用户已经尝试了多用户访问的一些问题 我认为这些问题与net and lck文件 所以问题是哪种是配
  • 如何用笑话测试 Promise 延迟?

    这是我用来延迟进程的代码 用于退避 export function promiseDelay ms return new Promise resolve gt setTimeout resolve ms 我想测试一下 但我无法测试 我尝试使
  • 在 iPhone 应用程序中使用 AVSystemController

    我想以编程方式降低iPhone的铃声音量 我发现可以用AVSystemController 但我知道 它是一个私有方法 如果我使用它 苹果会拒绝该应用程序还是请建议我其他方式 void setSystemVolumeLevelTo floa
  • 如何在 JavaScript 中省略对象的特定属性

    有没有一种干净的方法来返回一个新对象 忽略原始对象包含的某些属性 而不必使用像 lodash 这样的东西 const bar baz qux foo 现在你的对象qux具有以下所有属性foo除了bar and baz
  • Conda 命令在命令提示符中工作,但在 bash 脚本中不起作用

    只要我通过 Linux 终端 bash shell 使用我的 anaconda 4 5 4 它就可以正常工作 但是 在 bash 脚本中运行 conda 命令根本不起作用 脚本 test sh 包含以下几行 bin bash conda v
  • 如何使用 facebook api 获取朋友的生日列表?

    我正在尝试获取朋友的生日列表 但我不知道如何使用我的 api 来查找 Note 这不再可能了 看这个答案 https stackoverflow com a 28747657 1902010 在任何环境中使用 OpenGraph API 来
  • 如何更改 Ionic 4 中的工具栏颜色

    我正在使用 Ionic 4 应用程序 我想更改工具栏的背景颜色 但它不起作用 这是我尝试过的 ion toolbar background f2f2f2 ion toolbar background f2f2f2 important Lik
  • HTML:没有滚动条的水平滚动

    是否可以在没有水平滚动条的情况下进行水平滚动 在 Chrome 中这并不难 因为你可以使用 overflow y hidden 隐藏滚动条 查看this http jsfiddle net 9QYJ2 3 jsfiddle Html div
  • 查询带有特定文本的按钮

    我有一个 开玩笑 测试来确定按钮是否存在 it renders a signup button gt expect sut getByText Sign up for free toBeDefined 此测试是因为组件中有一个按钮和带有 免
  • 如何从大表中读取所有行?

    我在处理数据库 PostgreSQL 中的所有行时遇到问题 我收到错误 org postgresql util PSQLException Ran out of memory retrieving query results 我认为我需要小
  • 迁移学习准确性差

    我的任务是根据缺陷对种子进行分类 我有 7 个类的大约 14k 图像 它们的大小不相等 有些类有更多照片 有些类有更少 我尝试从头开始训练 Inception V3 准确率约为 90 然后我尝试使用带有 ImageNet 权重的预训练模型进
  • $_SERVER['HTTP_COOKIE'] 返回两个 PHPSESSID

    我得到两个PHPSESSID打印时 SERVER HTTP COOKIE 实际上我不知道它是如何设置两次的 它只在我的本地系统中 当我检查服务器 cookie 时 它 是这样的 echo SERVER HTTP COOKIE result
  • EF 3.1:克服 LINQ GroupBy SQL 转换问题 [重复]

    这个问题在这里已经有答案了 在 MS SQL Server 中 我有一个表 其中包含联系人呼叫历史记录 这是另一个表 由 EF 访问的实体如下 public partial class CallbackHistory public int