为什么 EF 会抛出“NotSupportedException:方法‘First’只能用作最终查询操作”

2024-03-24

int[] ids1 = { 1, 2, 3 };
int[] ids2 = { 1, 5, 6 };

var result = from a in ids1
             where a == ids2.First()
             select a;  
foreach (var item in result) ; //ok


var employees = from c in context.Employees.
                where c.EmployeeID == ids1.First() 
                select c;   
foreach (var item in employees); // NotSupportedException

当尝试打电话时ids1.First在 Linq-to-Entities 查询中,出现异常System.NotSupportedException:方法“First”只能用作最终查询操作。考虑在这种情况下使用“FirstOrDefault”方法.

a) 我不明白为什么First只能用作最终查询操作,因为在我们的示例中First被召唤IEnumerable<> ( ids1.First())而不是在IQueryable<>。换句话说,First在 Linq-to-Objects 查询中调用,而不是在 Linq-to-Entities 查询中调用?!

b) 无论如何,为什么必须First用作最终查询操作,而FirstOrDefault不一定是最终查询操作?

谢谢

REPLY:

至于 First() 和 FirstOrDefault() 之间的区别 - 我不知道 知道。你试过了吗,有效吗?

是的,它有效

否,First() 正在 LINQ to Entities 查询中调用。你在哪里 子句将转换为:Where(c => c.EmployeeID == ids1.First())

a) 我现在有点困惑。我意识到ids1.First本质上是在 Linq-to-Entities 查询中调用的,但事实仍然是First被召唤IEnumerable<>,因此First在 Linq-to-Objects 查询中调用,而此 Linq-to-Object 查询又在 Linq-To-entities 查询中调用 - 至少我是这么理解的?!

或者你是在暗示First以某种方式被召唤IQeryable<>?

b) 我意识到(c => c.EmployeeID == ids1.First())会被转换成表达式树,但为什么不呢ids1.First()在转换发生之前执行?

c) 不管怎样,一旦转换成表达式树,我假设当 sql 提供者收到我们的表达式树时where子句并尝试将其转换为 Sql 命令,该 Sql 提供程序没有执行的“权力”ids1.First为了取回结果(然后将其放入 Sql 查询中),因此出现异常?!

第二次回复:

a) 我还是很困惑为什么ids1.First在转换为表达式树之前没有执行?!即,具有以下子句

Where(c => c.EmployeeID == 2+3) 

表达方式2+3在此之前执行Where子句转化为表达式树!和ids.First也是一种表达,所以我期望类似的行为?!

b)很抱歉重复了,但这真的让我烦恼我的假设 - 那First在 Linq-to-Objects 查询中调用,而此 Linq-to-Object 查询又在 Linq-To-entities 查询中调用 - 正确吗?!

c) 也许我误解了你的帖子,但你是否暗示可以调用大多数其他 Linq-to-Object 运算符IEnumerable<> E, 即使E包含在 Linq-to-Entities 查询中?


No, First() is在 LINQ to Entities 查询中调用。你的where子句将转换为:

Where(c => c.EmployeeID == ids1.First())

该 lambda 表达式将转换为表达式树。

当然,做到这一点非常简单outside查询:

int firstId = ids1.First();
var employees = from c in context.Employees
                where c.EmployeeID == firstId
                select c;

这变得更简单:

int firstId = ids1.First();
var employees = context.Employees.Where(c => c.EmployeeID == firstId);

至于之间的区别First() and FirstOrDefault()- 我不知道。你试过了吗,有效吗?也许是因为First()在空序列上调用时会抛出异常,并且由于某种原因该行为可能难以翻译。

编辑:是的,查询提供者could可能会查看表达式树的那一部分并解决它 - 但迟早您必须在查询提供程序必须有多智能方面划清界限。它已经做了很多工作,而且对于you在这里做工作(按照我上面的例子) - 那么为什么不这样做呢?

请记住,从逻辑上讲,First()对每个元素执行context.Employees- 所以需要only如果存在任何行,则在空集合上引发异常 - 否则First()调用永远不会合乎逻辑。你看,这不是quite正如您所期望的那样简单:) 在这种情况下,您碰巧知道有are元素,所以你可以调用First()事先不受惩罚 - 但查询提供者不能。

编辑:回复第二次编辑...

a) 表达式 2+3 是编译时常数。将其更改为x + 2和加法运算will成为表达式树的一部分。特别是,如果您更改x (or ids1在您的示例中)这将更改查询 - 您无法更改 2+3 的含义。

b) 我不清楚你的意思。 EF 查询中包含的表达式树包括对Enumerable.First,如果这就是你的意思。

c) 由查询提供者决定到底支持哪些表达式树 - 这也适用于其他方法调用(例如int.Parse) 以及 LINQ to Objects 方法。

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

为什么 EF 会抛出“NotSupportedException:方法‘First’只能用作最终查询操作” 的相关文章

  • LINQ to SQL 查询结果中包含错误值

    我的 LINQ 查询结果不正确 但当我分析生成的 SQL 时 SQL 结果是正确的 ApplicationsEntities context new ApplicationsEntities var query from documenta
  • 实体框架 - 预加载两个多对多关系

    很抱歉这么长 但至少我认为我获得了所有信息以便能够理解并可能有所帮助 我想使用预加载从数据库加载数据 数据设置在五个表中 设置两个级别的 m n 关系 因此 存在三个包含数据的表 以从上到下的层次结构方式排序 CREATE TABLE db
  • 比较大型集合的 i4o 与 PLINQ

    我有一个问题想问任何有 i4o 或 PLINQ 经验的人 我有一个大对象集合 大约 400K 需要查询 逻辑非常简单明了 例如 有一个 Person 对象的集合 我需要找到与相同的名字 姓氏 出生日期或名字 姓氏的第一个首字母等匹配的人员
  • Linq:计算行组,包括 0 缺失行

    我想使用 Linq to Entities 将活动列表总结为上周按天发生的次数 例如 假设我的数据库中有这样的数据 Id Date 1 2011 09 30 0 00 0 2 2011 10 02 0 00 00 3 2011 10 02
  • 如何在 EF 查询中执行日期比较?

    请帮忙 我试图弄清楚如何在 linq 查询中使用 DATE 或 DATETIME 进行比较 例子 如果我想要今天之前开始的所有员工姓名 我会在 SQL 中执行以下操作 SELECT EmployeeNameColumn FROM Emplo
  • MySql 中的 EntityFunctions 支持

    我在 MySQL 中使用 EntityFunctions DiffMinutes 时遇到错误 下面是我的代码 return db DiscoveredDevices Where m gt EntityFunctions DiffMinute
  • 使用 LINQ 过滤列表

    我有一个从外部应用程序返回的人员列表 并且我正在本地应用程序中创建一个排除列表 以便我可以选择手动从列表中删除人员 我有一个我创建的复合键 它对两者都是通用的 我想找到一种使用我的列表从我的列表中删除人员的有效方法 e g class Pe
  • EF Code First 预加载和 OrderBy 问题

    我有两个名为 类别 和 产品 的实体 具有 1 n 关系 我想要一个带有子项的类别 子项是有序的 这是我的链接 db Categories Where c gt c CategoryID catID Include c gt c Produ
  • 如何在实体框架中使用 DateTime.AddDays(x)

    我有这个代码 from pr in e ProgramSetup Include Program Include Program Client where pr DateBegin lt DateTime Now pr DateEnd gt
  • 调用失败,参数为空

    我有以下代码 public static ContactEventValue GetContactEventValue ContactEventType contactEventType string programCode string
  • 在 Linq toEntity 中将 int 转换为字符串时出现问题

    var items from c in contacts select new ListItem Value c ContactId Cannot implicitly convert type int ContactId to strin
  • 我可以在 LINQ 查询中使用扩展方法吗?

    我有以下代码 public QuestionDetail GetQuestionDetail int questionId Question question questionsRepository GetById questionId Q
  • 在 LINQ 查询的选择部分中调用方法

    我有以下 linq 查询 var file from p in database tblFile join o in database tblFileVersion on p fldFileID equals o fldFileID joi
  • EntityFrameworkCore.Sqlite - 如何查询包含给定列表所有项目的子列表的实体?

    给定以下模型 public class ApiImageModel public int ID get set public List
  • 如何对 LINQ to Objects 查询进行分区?

    这是一个资源分配问题 我的目标是运行查询来获取任何时间段的最高优先级班次 数据集非常大 对于此示例 假设 1000 家公司每个班次有 100 个班次 尽管实际数据集更大 它们都已加载到内存中 我需要对它们运行单个 LINQ to Objec
  • 就像实体框架中的运算符一样? [复制]

    这个问题在这里已经有答案了 我们正在尝试在实体框架中为具有字符串字段的实体实现 LIKE 运算符 但它似乎不受支持 还有其他人尝试过做这样的事情吗 This 博客文章 http th2tran blogspot com 2009 06 li
  • 如何编写 Linq 表达式来对一组实体调用 OrderBy?

    有人可以解释构建表达式的语法 该表达式将按实体上用户指定的属性进行排序吗 这篇 MSDN 文章对提供帮助有很大帮助 但它涉及一个简单的字符串列表 我的数据集包含我自己的自定义对象 http msdn microsoft com en us
  • LINQ 生成具有重复嵌套选择的 SQL

    我对 NET 实体框架非常陌生 我认为它很棒 但不知怎的 我遇到了这个奇怪的问题 抱歉西班牙语 但我的程序是用那种语言写的 无论如何 这没什么大不了的 只是列或属性名称 我正在执行正常的 LINQ To Entities 查询来获取 Ult
  • Linq:方法无法转换为存储表达式

    我目前正在尝试限制哪些用户可以访问哪些组 并通过使用 linq 来做到这一点 当我将相关组添加到视图时 出现了我的问题 我不断收到的错误是 LINQ to Entities 无法识别方法 System String GetUserId Sy
  • 难道 Linq to SQL 没有抓住要点吗? ORM 映射器(SubSonic 等)不是次优解决方案吗?

    我希望社区能够了解我对 Linq to Sql 和其他 ORM 映射器的一些想法 我喜欢 Linq to Sql 以及用本机开发语言表达数据访问逻辑 或一般的 CRUD 操作 的想法 而不必处理 C 和 SQL 之间的 阻抗不匹配 例如 要

随机推荐