Linq lambda 表达式中的布尔短路求值

2024-01-23

我有以下 Linq lambda 表达式:

private IEnumerable<SubjectSelectorSubjectGroup> GetSubjectList()
{
    User user = db.Users.Find(WebSecurity.CurrentUserId);
    return db.RequiredSubjects.Where(r => !r.Subject.Name.Contains("Home"))
                              .GroupBy(r => r.Subject)
                              .OrderByDescending(r => r.Count())
                              .Select(r => new SubjectSelectorSubjectGroup()
                              {
                                  SubjectId = r.Key.SubjectId,
                                  SubjectName = r.Key.Name,
                                  IsInFavourites = HttpContext.Current.Request.IsAuthenticated &&
                                                  (user.Elective1 != null && user.Elective1.SubjectId == r.Key.SubjectId ||
                                                   user.Elective2 != null && user.Elective2.SubjectId == r.Key.SubjectId ||
                                                   user.Elective3 != null && user.Elective3.SubjectId == r.Key.SubjectId),
                                  Occurrences = r.Count()
                              });
}

当用户未登录时user该函数中的变量为空。这应该不是问题,因为短路布尔求值should处理它。问题是,事实并非如此!相反,一个System.NullReferenceException被抛出。

当用户为空时HttpContext.Current.Request.IsAuthenticated返回假。我已经通过注释掉引用的括号部分来检查了这一点user变量,然后表达式计算正确。

有谁知道为什么Linq to Sql尝试取消引用user在这种情况下实际上不需要变量吗?有人可以解决这个问题吗?


整个表达式被翻译为 SQL 并进行计算,这意味着&&操作员没有像预期那样短路。

您可以通过构建列表或数组来解决问题ElectiveX.SubjectId您想要搜索然后使用tmpList.Contains(r.Key.SubjectId)在查询中。这将被翻译成WHERE IN (...)SQL 表达式。

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

Linq lambda 表达式中的布尔短路求值 的相关文章

随机推荐

  • Magento 中按类别销售?

    我们的 Magento 网站上有一个名为 清仓 的类别 理想情况下 如果能够获得该类别中所有已售订单的报告 那就太好了 我是否可以将订单集合与产品集合结合起来并按类别 ID 进行过滤 这是一个类似的线程 http www magentoco
  • 使用 std::memcpy 来处理非平凡可复制类型的对象

    标准定义我们可以通过以下方式使用 std memcpy int 对于任何普通可复制类型 T 如果两个指向 T 的指针指向 不同的 T 对象 obj1 和 obj2 其中 obj1 和 obj2 都不是 基类子对象 如果组成 obj1 的基础
  • 为什么我们需要密封课程?

    我知道 Sealed 类的功能 那它是不可继承的 但我的问题是为什么我们需要密封课程 如果动机不是继承属性和方法 为什么不将它们声明为私有呢 首先 让我们从定义开始 seal 是一个修饰符 如果应用于类 则使其不可继承 如果应用于虚拟方法或
  • XCode 4.2 缺少模拟器的 iOS5 SDK

    我在针对 iPhone 5 的 OSX Lion 10 7 2 上使用 Xcode 4 2 创建了一个空的单视图应用程序 该项目构建得很顺利 但是在启动模拟器时我收到以下错误消息 iOS 模拟器找不到 SDK 可能需要重新安装 SDK 然后
  • 如何立即从 runloop 中删除计时器

    我有一个在 5 秒内触发的计时器添加到全局队列中 尽管我在 2 秒后使其无效 但运行循环直到 5 秒才会终止 在下面的代码片段中 backgroundTimer是一个实例var run是一个成员函数 以下代码中有什么问题阻止了运行循环终止
  • 没有匹配项时的 LINQ 结果?

    当没有匹配项时 LINQ 函数到底返回什么 以Where方法为例 var numbers Enumerable Range 1 10 var results numbers Where n gt n 50 此时结果会怎样 results本身
  • 你能在c#中使用“where”来要求属性吗?

    我想创建一个只接受可序列化类的泛型类 可以通过 where 约束来完成吗 我正在寻找的概念是这样的 public class MyClass
  • 在所有 DataFrame 列中搜索值(第一列除外!)并添加具有匹配列名称的新列

    我想对 DataFrame 的所有列 第一列除外 进行搜索 并添加一个具有匹配列名称的新列 如 Column Match 我尝试过这样的事情 df apply lambda row row astype str str contains m
  • 如何使用javascript更改CSS类属性? [复制]

    这个问题在这里已经有答案了 有人可以告诉我如何通过 javascript 更改 css 类属性吗 例子 winner background color white 如何更改班级获胜者背景颜色的值 当我写的时候 var some docume
  • 如何绘制渐变路径

    我怎样才能画画Path带有褪色 不透明度或粗细 线 像这样的东西 我知道有LinearGradient着色器Paint 但不会bend沿着Path 一种可能的解决方案可能是沿着Path然后我自己通过分段来绘制它 但我也找不到任何方法 我想出
  • Eloquent chunk() 缺少一半结果

    我对 Laravel 的 ORM Eloquent chunk 方法有疑问 它错过了一些结果 这是一个测试查询 destinataires Destinataire where statut lt 3 gt where tokenized
  • Travis CI 可以为特定 Matrix 配置生成徽章吗?

    我正在针对两个不同版本的 SDK 测试我的库 稳定 SDK 和开发 SDK 具体来说 https travis ci org google serialization dart https travis ci org google seri
  • 检查号码是否在范围内

    我正在检查来自输入字段的号码是否在范围内 function timeCheck var time trim enterTime value Number prototype between function min max return t
  • 如何知道 Node.js Express 服务器何时启动并可供使用

    有一个应用程序 我想启动节点快速服务器 然后在服务器启动后立即在同一台计算机上自动启动浏览器 如何查询服务器是否已启动并准备就绪 我真的希望在 listen 调用上有某种回调 但似乎没有 我可以等待比我预期的时间更长的时间 但是这是在现场的
  • 用作 Google Chrome 书签

    先说一下我遇到的问题 我需要多次填写同一个网页 而且我需要填写的内容大部分是相同的 但分散在整个网页中 我想到的解决方案 我知道有一种方法可以创建一些 javascript 函数 将其放在 google 书签后面 这样当您在该页面上时 只需
  • Composer 2.0.8 问题 package-versions-deprecated

    使用 PHP 7 2 Installing composer package versions deprecated 1 8 0 Extracting archive Plugin initialization failed include
  • 可以裁剪相机预览吗?

    我还没有找到任何方法来裁剪相机预览然后将其显示在 SurfaceView 上 Android 是否可以裁剪相机预览 您可以在没有覆盖视图的情况下执行此操作 这不适用于所有情况 子类化 ViewGroup 将 SurfaceView 添加为唯
  • Jasper Reports 在新页面上的子报表

    我有一个 jasper 报告 由 6 个子报告组成 每个子报告都有自己的标题部分 现在我需要每个报告都从新页面开始 我尝试添加分页符 但它对我不起作用 在研究这个问题时 我遇到了一个设置技巧isTitleNewPage to true at
  • 服务器打印到标准输出而不是套接字

    我正在研究 UNIX 网络编程中的示例 并且我已将 daytimeclientserv c 改编成此处的代码 服务器按预期向客户端发送日期 时间字符串 但启动时收到的第一个请求除外 当我第一次运行服务器程序 在局域网中的另一台计算机上 时
  • Linq lambda 表达式中的布尔短路求值

    我有以下 Linq lambda 表达式 private IEnumerable