为什么 Select、Where 和 GroupBy 的这种组合会导致异常?

2023-11-23

我有一个简单的服务表结构,每个服务都有多个设施。在数据库中,这是一个Service表和一个Facility表,其中Facility表引用了服务表中的一行。

在我们的应用程序中,我们有以下 LINQ 工作:

Services
    .Where(s => s.Facilities.Any(f => f.Name == "Sample"))
    .GroupBy(s => s.Type)
    .Select(g => new { Type = g.Key, Count = g.Count() })

但由于我无法控制的原因,源集在Where调用,这样:

Services
    .Select(s => new { Id = s.Id, Type = s.Type, Facilities = s.Facilities })
    .Where(s => s.Facilities.Any(f => f.Name == "Sample"))
    .GroupBy(s => s.Type)
    .Select(g => new { Type = g.Key, Count = g.Count() })

但这会引发以下异常,没有内部异常:

EntityCommandCompilationException: The nested query is not supported. Operation1='GroupBy' Operation2='MultiStreamNest'

删除Where然而,使它起作用,这让我相信它只在方法调用的这种特定组合中:

Services
    .Select(s => new { Id = s.Id, Type = s.Type, Facilities = s.Facilities })
    //.Where(s => s.Facilities.Any(f => f.Name == "Sample"))
    .GroupBy(s => s.Type)
    .Select(g => new { Type = g.Key, Count = g.Count() })

有没有办法使上述工作:选择一个非实体对象,然后使用Where and GroupBy关于结果可查询?添加ToList之后Select可行,但大型源集使得此操作不可行(它将在数据库上执行查询,然后在 C# 中执行分组逻辑)。


这个异常源于EF源码中的这段代码...

// <summary>
// Not Supported common processing
// For all those cases where we don't intend to support
// a nest operation as a child, we have this routine to
// do the work.
// </summary>
private Node NestingNotSupported(Op op, Node n)
{
    // First, visit my children
    VisitChildren(n);
    m_varRemapper.RemapNode(n);

    // Make sure we don't have a child that is a nest op.
    foreach (var chi in n.Children)
    {
        if (IsNestOpNode(chi))
        {
            throw new NotSupportedException(Strings.ADP_NestingNotSupported(op.OpType.ToString(), chi.Op.OpType.ToString()));
        }
    }
    return n;
}

我必须承认:这里发生的情况并不明显,也没有技术设计文档公开 EF 的所有查询构建策略。但是这段代码...

// We can only pull the nest over a Join/Apply if it has keys, so
// we can order things; if it doesn't have keys, we throw a NotSupported
// exception.
foreach (var chi in n.Children)
{
    if (op.OpType != OpType.MultiStreamNest
        && chi.Op.IsRelOp)
    {
        var keys = Command.PullupKeys(chi);

        if (null == keys
            || keys.NoKeys)
        {
            throw new NotSupportedException(Strings.ADP_KeysRequiredForJoinOverNest(op.OpType.ToString()));
        }
    }
}

可以稍微窥探一下窗帘后面的情况。我刚刚尝试了一个OrderBy在我自己的情况下,它完全复制了你的情况,并且它有效。所以我很确定如果你这样做...

Services
    .Select(s => new { Id = s.Id, Type = s.Type, Facilities = s.Facilities })

    .OrderBy(x => x.Id)

    .Where(s => s.Facilities.Any(f => f.Name == "Sample"))
    .GroupBy(s => s.Type)
    .Select(g => new { Type = g.Key, Count = g.Count() })

异常将会消失。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Select、Where 和 GroupBy 的这种组合会导致异常? 的相关文章

随机推荐

  • Office JS API 中发生错误时没有堆栈跟踪信息

    我们在 Application Insights 中收到大量 Office JS API 错误 但它们没有堆栈跟踪 我们拥有的一切 The browser s same origin policy prevents us from gett
  • 如何避免R自动将日期转换为数字?

    如何避免 R 在 for 循环中将日期转换为数字 这与这个问题有关 该问题显示了 mapply 的相同行为禁用 mapply 自动将日期转换为数字 date lt c 2008 02 20 2009 10 05 date lt as Dat
  • 使用 onsen UI 的下拉选项菜单

    我想开发 Android 导航工具栏中可用的下拉菜单标题 我正在使用phonegap 和onsen UI 框架来开发移动应用程序 我可以从左侧和右侧加载滑动菜单 但现在我的要求是 如果应该按图像中显示的图标 则打开下拉菜单 如果用户从电话设
  • ActionBar 项目始终出现在溢出菜单中

    我正在尝试在操作栏中添加操作项目 但即使有很多空间 项目也总是添加到溢出列表中 有什么建议可以解决这个问题吗 这应该是这样的 main xml menu menu
  • JQuery:根据列值显示/隐藏表行

    我有一个表 其中有一列的可能值是 是 否 table thead tr th Col1 th th Col2 th th ActiveYN th tr thead tbody tr td Apple td td 12345 td td Ye
  • 快速展开可选值时意外发现 nil

    我收到一条错误消息 意外发现nil当打开一个Optional 来自 Swift 具有以下类 错误发生在该行 cell contentView viewWithTag 1 as UILabel text object firstName as
  • 使用 jQuery 从 DOM 元素创建 json

    如果我有以下 DOM 元素 div class item content1 div div class item content2 div 如何使用 jQuery 和 Javascript 构建如下所示的 JSON 对象 classname
  • PermissionDenied:403 IAM 权限“dialogflow.intents.list”

    我尝试使用 Dialogflow 的 V2 API 获取 Dialogflow 代理中的意图列表 但出现以下错误 PermissionDenied 403 projects xxxx agent 上的 IAM 权限 dialogflow i
  • 时区缩写

    TimeZoneInfo不提供给定时区的缩写或短名称 唯一的好方法是拥有一本字典 将缩写映射到Timezone id StandardName or DaylightName特性 但是 我搜索缩写列表的所有来源都有不同的时区名称 即与 Wi
  • 即使使用 error_reporting(0),PHP 仍会回显错误的原因是什么?

    无论您告诉它禁用什么 PHP 都会强制显示错误 有哪些原因 我努力了 error reporting 0 ini set display errors 0 没有运气 请注意手册中的警告http uk php net error report
  • 在 R 中将字符串修剪为特定数量的字符

    我想将字符向量修剪为每个元素中的前五个字符 在此示例中 我想将字符串中的每个数字修剪为前五个字符 我确信一定有一种简单的方法可以做到这一点 string lt c 3243423 23423 34243234 2342 32544532 8
  • 开发简单的序列号生成器/验证器的好方法是什么?

    我正在开发一款应用程序 希望有一天能够出售 宜早不宜迟 我想开发一个相当简单的序列号方案来保护它 简单的数字 字母组合 长度不超过 25 30 个字母数字字符 例如 Microsoft 产品密钥 不要求用户输入任何个人信息 例如电子邮件地址
  • 检查文本框文本是否为空

    我使用以下代码来检查空文本框 如果为空 则跳过复制到剪贴板并继续执行代码的其余部分 我不明白为什么我会收到 值不能为空 异常 难道它不应该看到空值并继续前进而不复制到剪贴板吗 private void button Click object
  • iPhone 屏幕截图以供查看

    在 iPhone 上 是否可以 屏幕捕获 UIView 及其所有子视图 如果可以的话 如何实现 I found this 但我自己没有尝试过 Here你发现用过的 renderInContext 我将上面的代码转换为 UIView 上的类别
  • 触摸移动某些元素时禁用滚动

    我有一个页面 其中有一个部分可以在其中绘制绘图 但是在移动浏览器上使用它时 触摸移动事件 至少是垂直事件 也会滚动页面 这会降低绘制体验 有没有办法a 禁用并重新启用页面滚动 这样我可以在每行启动时将其关闭 但在每行完成后将其重新打开 或b
  • 是否可以从其他表单触发点击事件?

    我需要运行另一个表单上的按钮的代码 是否可以通过不同的形式来做到这一点 如果你说可以通过声明公开来实现 那么 我如何将控件声明为公共 我如何将正确的事件传递到button click 它需要两个参数 我如何传递它们 为什么不在共享类中创建一
  • Javascript 外部作用域变量访问

    OperationSelector function selectElement this selectElement selectElement OperationSelector prototype populateSelectWith
  • 弹出框未锚定到触发元素

    So my Twitter Bootstrap popovers当触发元素包含在具有以下样式的元素中时 似乎会受到位置挑战 ms overflow y auto 窗口内的可滚动元素 当元素滚动时 弹出窗口不会随之滚动 我真的希望弹出窗口能够
  • 如何将 Paypal 与 WinForm 桌面应用程序集成

    我希望我的 Windows 窗体桌面应用程序能够与 PayPal 集成 以便我可以通过 WinForms 应用程序向用户收费 有没有这方面的资源 或者可以做到吗 我可能刚刚找到了解决方案 访问 PayPal 的此网页 https www x
  • 为什么 Select、Where 和 GroupBy 的这种组合会导致异常?

    我有一个简单的服务表结构 每个服务都有多个设施 在数据库中 这是一个Service表和一个Facility表 其中Facility表引用了服务表中的一行 在我们的应用程序中 我们有以下 LINQ 工作 Services Where s gt