Entity Framework 现在不能在 Linq include 语句中使用 Core 3.1 匿名投影?
Entity Framework Core 3.1 anonymous projections cannot now be used in Linq include statements?
所以我从第 4 版开始就一直在使用 Entity Framework,并且最近对我正在做的项目进行了一些重大更改。可以说我正在使用 EF 在 ETL 过程中使用 EF Core 3.1.2(即 EF Core 2.2.6)获取一个数据库与另一个数据库的差异。现在损坏的部分有类似的代码。
var setOne = await 1stContext.table.Where(x => x.DateModified >= inputDate)).Select(x => new { x.UserId, x.RoleId, x.UniversityId }).ToListAsync();
var toRemove = 2ndContext.table.Where(x => setOne.Contains(new { x.UserId, x.RoleId, x.UniversityId })).ToList();
有一个匿名投影 'new { (items) }' 曾经有效,但现在它爆炸了。我尝试转换为自 C# 7 以来新增的命名元组,但根据编译器,您不能在表达式树中执行此操作。那么对新方法有什么想法吗?也许只是做一个 linq 连接或类似的?我的想法总是在实现数据之前先执行 where 子句,这样等效的 sql 不会给我所有结果然后再检查它们。
更新这是一个简单的打印屏幕,没有我的意思。我一直用非常宽的集合来做这个,我只想做一个较小的集合然后找到它。我可以做一个连接,但关键是如果你看我的第二个陈述,我还没有用 'toList' 投影到一个真实的对象,如果我这样做了,我将失去获取我想删除的对象的能力.我可能会加入,但我只是不想进行昂贵的数据库调用来获取所有内容然后进行过滤。但是加入可能会起作用。我明天可能会在工作中玩这个,但如果有人知道的话,我只想把它放在这里。
根据 Ivan Stoev 所说,我只是将 'AsEnumerable' 放在实体声明之后和 where 之前。似乎 EF Core 3.1 比以前的迭代要严格得多。
所以这个:
2ndContext.table.Where
变成了这个:
2ndContext.table.AsEnumerable().Where
只是基本上明确地说明,根据我从其他人那里收集到的信息,它以前是在暗示我的客户。
所以我从第 4 版开始就一直在使用 Entity Framework,并且最近对我正在做的项目进行了一些重大更改。可以说我正在使用 EF 在 ETL 过程中使用 EF Core 3.1.2(即 EF Core 2.2.6)获取一个数据库与另一个数据库的差异。现在损坏的部分有类似的代码。
var setOne = await 1stContext.table.Where(x => x.DateModified >= inputDate)).Select(x => new { x.UserId, x.RoleId, x.UniversityId }).ToListAsync();
var toRemove = 2ndContext.table.Where(x => setOne.Contains(new { x.UserId, x.RoleId, x.UniversityId })).ToList();
有一个匿名投影 'new { (items) }' 曾经有效,但现在它爆炸了。我尝试转换为自 C# 7 以来新增的命名元组,但根据编译器,您不能在表达式树中执行此操作。那么对新方法有什么想法吗?也许只是做一个 linq 连接或类似的?我的想法总是在实现数据之前先执行 where 子句,这样等效的 sql 不会给我所有结果然后再检查它们。
更新这是一个简单的打印屏幕,没有我的意思。我一直用非常宽的集合来做这个,我只想做一个较小的集合然后找到它。我可以做一个连接,但关键是如果你看我的第二个陈述,我还没有用 'toList' 投影到一个真实的对象,如果我这样做了,我将失去获取我想删除的对象的能力.我可能会加入,但我只是不想进行昂贵的数据库调用来获取所有内容然后进行过滤。但是加入可能会起作用。我明天可能会在工作中玩这个,但如果有人知道的话,我只想把它放在这里。
根据 Ivan Stoev 所说,我只是将 'AsEnumerable' 放在实体声明之后和 where 之前。似乎 EF Core 3.1 比以前的迭代要严格得多。
所以这个:
2ndContext.table.Where
变成了这个:
2ndContext.table.AsEnumerable().Where
只是基本上明确地说明,根据我从其他人那里收集到的信息,它以前是在暗示我的客户。