LINQ to Entities 条件给出奇怪的结果

2024-01-24

尝试在 LINQ 查询(使用 Entityframework)中实现条件会创建奇怪的查询。在某些情况下,即使阈值设置为 180 秒,这些查询也会超时:

                List<LogEntity> dataList = db.LogEntities.Where(x =>
                x.Source == "Source" &&
                (String.IsNullOrEmpty(from) || x.EventDate >= cFrom) &&
                (String.IsNullOrEmpty(to) || x.EventDate <= cTo) &&
                (String.IsNullOrEmpty(uid) || x.DomainUserLogin == uid) &&
                (String.IsNullOrEmpty(cid) || x.CaseReference == cid) &&
                (String.IsNullOrEmpty(searchtext) || x.Message.Contains(searchtext)))
                .OrderByDescending(y => y.EventDate)
                .Take(500)
                .ToList<LogEntity>();

使用不太优雅的 if 语句,我没有遇到任何问题,并且查询会在几秒钟内返回:

                IQueryable<LogEntity> data = db.LogEntities.Where(x => x.Source == "Source");
            if (!String.IsNullOrEmpty(from))
                data = data.Where(x => x.EventDate >= cFrom);
            if (!String.IsNullOrEmpty(to))
                data = data.Where(x => x.EventDate <= cTo);
            if (!String.IsNullOrEmpty(uid))
                data = data.Where(x => x.DomainUserLogin == uid);
            if (!String.IsNullOrEmpty(cid))
                data = data.Where(x => x.CaseReference == cid);
            if (!String.IsNullOrEmpty(searchtext))
                data = data.Where(x => x.Message.Contains(searchtext));
            data = data.OrderByDescending(x => x.EventDate).Take(500);
            List<LogEntity> dataList = data.ToList<LogEntity>();

条件都是从查询字符串传递的,这就是为什么它们有时可能带有值,有时不带有值。

使用三元运算符时会出现同样的问题,例如

...Where(x => truth ? x.something == somevalue : x.something == anothervalue)

对于为什么这些内联条件性能如此差,是否有任何合理的解释?


当您在 EF 数据库上使用 LINQ 编写查询时,它们看起来非常自然,但在幕后有一个查询翻译器会解析您的 LINQ 查询并将其分为两部分:一个在 sql 服务器上执行,另一个 - 仅使用 LINQ 扩展在客户端上执行。

当您使用查询转换器无法转换为 SQL 的某些表达式(例如某些 .NET 函数)时,它会最大限度地减少数据过滤,您最终可能会将整个数据表下载到客户端并对其进行过滤。

在您编写的第一个查询中,您使用(String.IsNullOrEmpty(from) || x.EventDate >= cFrom); “from”是 LogEntities 外部的,翻译者无法对其值以及如何根据记录计算它进行任何假设。因此,最有可能的是,您只需将完整的 LogEntities 下载到客户端并将其过滤到客户端。如果记录数量很大,您将收到超时错误。

在第二个查询中,您加入了简单表达式Where(x => x.DomainUserLogin == uid);这已经清楚地翻译成sql了。因此,您将获得正确的 sql 查询,该查询可以过滤 sql 服务器端的大多数记录。

您可以使用 SQL 探查器或 VS 工具(取决于 VS 版本,或启用 EF 中的日志记录以查看执行的实际查询)。

MSDN上有一些信息 https://msdn.microsoft.com/en-us/library/bb399342(v=vs.110).aspx

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

LINQ to Entities 条件给出奇怪的结果 的相关文章

随机推荐

  • Resharper 中的 Jasmine 测试不会停止执行

    我使用 Visual Studio 2012 和 ReSharper 8 2 来测试我的 JavaScript 代码 到目前为止 使用 QUnit 工作得很好 在编写 Jasmine 测试时 当在文件开头添加以下行时 测试不会停止
  • Flexbox 等高不起作用

    我正在尝试将 flexbox 与 susy 一起使用 但不知何故它不起作用 我尝试了我在这里找到的所有问题 但它总是会中断 并且文本容器和图像容器不能保持相同的高度 移动视图从 38 em 开始工作 但不能 这就是我尝试过的 一旦我添加di
  • C++ 阻塞工作队列

    这个问题应该比我上几个简单一点 我在我的程序中实现了以下工作队列 Pool h tpool class It s always closed glasses ifndef POOL H define POOL H class tpool p
  • ImageMagick:此图像格式“”没有解码委托@ error/constitute.c/ReadImage/504

    Problem ImageMagick Convert 无法裁剪图像 看起来它不识别图像类型 我尝试过的 我在网上搜索了一下 发现了几个类似的问题 但不是我的 我尝试过他们的解决方案 包括 通过brew卸载并重新安装ImageMagick
  • 在Java中使用“instanceof”[重复]

    这个问题在这里已经有答案了 instanceof 运算符的用途是什么 https stackoverflow com questions 7313559 what is the instanceof operator used for 我了
  • 不同处理器上的浮点计算是否会有所不同? (+在 C# 和 C 之间传递双精度数)

    我有一个用 C 编写的应用程序 它也调用一些 C 代码 C 代码获取一些双精度值作为输入 对其执行一些计算 将其传递到本机层 由本机层对其执行自己的计算 然后传回 C 层 如果我在不同的机器上运行相同的exe dll 它们都是Intel的x
  • 从 gradle 中的多个依赖项中排除同一组?

    我的 Android 项目的应用程序模块的 build gradle 中有以下代码 implementation com google firebase firebase core 16 0 1 exclude group com andr
  • XCode 4,签名无效 (-19011)

    我要疯了 我正在使用 XCode 4 最后我完成了我的应用程序 我正准备将其提交到 App Store 上传到 iTunes Connect 我尝试构建存档 但出现了此警告 Application failed codesign verif
  • cx_freeze 错误:找不到模块 tkinter

    我开始遇到一些 miniconda 和 PyCharm 问题 所以我不得不重新安装它们 但是 现在当我使用 cx freeze 创建 exe 时 出现以下错误 这是我的代码 from tkinter import from tkinter
  • 为什么 32 位处理器只能寻址 4GiB 内存,即使字大小很大?

    Until now I thought that a 32 bit processor can use 4 GiB of memory because 232 is 4 GiB but this approach means process
  • 如何查找 Word 段落的页码?

    我正在尝试解析 Word 文档 并且我要查找的信息应仅位于第一页 有没有办法获取段落的页码 foreach Word Paragraph p in document Paragraphs pageNo if pageNo 1 p Range
  • 如何在 Spring Batch 中使用 Hsqldb 解决此 SQLTransactionRollbackException?

    我正在开发一个需要定期执行作业的 Spring Batch 应用程序 这是我的配置文件的一个片段 它设置用于事务处理的内存 hsqldb 数据库 Bean public SimpleJobLauncher simpleJobLauncher
  • 删除 Primefaces 组件中的所有样式?

    是否可以从 Primefaces 组件中删除所有样式 我的意思是 组件集很好 但必须手动覆盖每个组件的每一点以使组件样式适合我的应用程序的整体设计 这并不好 我不能花几个小时使用 Firebug 来查找它使用哪些类等等等 那么有没有办法删除
  • 应用动态实施

    我正在尝试将 Appdynamics 添加到我的应用程序中 我正在执行以下步骤 https docs appdynamics com display PRO40 Instrument an Android Application Instr
  • 检查 C 中的数组是否对称

    我正在研究一个示例问题 它要求我检查用户输入的数组是否对称 我已经弄清楚如何通过创建另一个数组 以相反的顺序复制第一个数组 然后检查它们是否彼此相等来做到这一点 如下面的代码所示 include
  • 如果禁用 GPS,三星手机将无法获取位置信息

    我使用三星手机通过 LocationManager API 获取位置 如果禁用 GPS 我无法获取位置 通过网络提供商我无法获取位置 这是代码 这在 HTC 和索尼甚至禁用 GPS 中都可以正常工作 但在三星手机中则不行 public Lo
  • 实体框架 - 仅更新不为空的值

    这对我来说有点新鲜 我被要求编写一个 ETL 程序 将两个数据集加载到同一个表中 数据集 1 已完成并包含表的所有数据 然而 数据集 2 仅包含changes需要覆盖到第一个数据集上 观察 数据集 1 小部件表 ID COL1 COL2 C
  • 外部硬盘上的 Docker 卷

    我正在使用 postgres 映像在本地运行容器 我需要处理大量数据 并且我想为此使用外部硬盘驱动器 是否可以在外部硬盘驱动器上安装卷 我可以完成我想要的吗Flocker https github com ClusterHQ flocker
  • 对于 Linux 上的 Windows 文件路径,Path.startsWith 返回 false

    为什么会这样呢 Path parent1 Paths get flugel borf noggin Path child1 Paths get flugel borf noggin foo bar baz jpg System out pr
  • LINQ to Entities 条件给出奇怪的结果

    尝试在 LINQ 查询 使用 Entityframework 中实现条件会创建奇怪的查询 在某些情况下 即使阈值设置为 180 秒 这些查询也会超时 List