EF Core 3.1 引发 Contains 异常

2023-12-03

我最近将项目代码更新为 .NET Core 3.1 和 EF Core 3.1,现在我的大部分 linq 查询都停止了,EX。

public override ICollection<ContactDetailModel> GetAll(ICollection<int> ids)
{
            return _context
                .Set<TEntity>()
                .IgnoreDeletedEntities()                
                .Where(x => ids.Distinct().Contains(x.ContactId))                
                .Select(EntityToDTOMapper)
                .ToList();
}

这段代码在我使用 Contains 的地方抛出一个错误,我在其他一些帖子中看到这个问题已作为错误修复,但它失败了。

我得到的错误是“无法翻译。要么以可以翻译的形式重写查询,要么通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用来显式切换到客户端评估”。

System.InvalidOperationException
  HResult=0x80131509
  Message=The LINQ expression 'DbSet<SupplierContactDetails>
    .Where(s => !(s.DeletedOn.HasValue) && !(s.DeletedBy.HasValue))
    .Where(s => __Distinct_0
        .Contains(s.ContactId))' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync(). See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.
  Source=Microsoft.EntityFrameworkCore
  StackTrace:
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.<VisitMethodCall>g__CheckTranslated|8_0(ShapedQueryExpression translated, <>c__DisplayClass8_0& )
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   at System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   at Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore[TFunc](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
   at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
   at Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   at BlueTag.DAL.Repositories.ContactRepository`1.GetAll(ICollection`1 ids) in D:\Projects\BlueTag Version 2\.net-core-server\DAL\Repositories\ContactRepository.cs:line 95
   at BlueTag.DAL.Repositories.SupplierRepository.ToDomain(IEnumerable`1 supplier) in D:\Projects\BlueTag Version 2\.net-core-server\DAL\Repositories\SupplierRepository.cs:line 216
   at BlueTag.DAL.Repositories.SupplierRepository.GetFilteredSuppliers(RequestPagingOptionsModel`1 options) in D:\Projects\BlueTag Version 2\.net-core-server\DAL\Repositories\SupplierRepository.cs:line 129
   at BlueTag.Supplier.Services.SupplierService.GetFilteredSupplierDetails(RequestPagingOptionsModel`1 options) in D:\Projects\BlueTag Version 2\.net-core-server\Supplier\Serrvices\SupplierService.cs:line 49
   at BlueTag.Supplier.Controllers.SupplierController.GetFilteredSuppliers(RequestPagingOptionsModel`1 options) in D:\Projects\BlueTag Version 2\.net-core-server\Supplier\Controllers\SupplierController.cs:line 54
   at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()


实体框架无法翻译每个查询,因此有时必须加载所有数据并在内存中执行 LINQ 表达式,这称为客户端评估,并且是不需要的,因为它会占用更多资源并且需要更长的时间。对于您的具体问题,有两种解决方案,错误消息中概述了这两种解决方案。

1) 重写 LINQ 查询以包括对客户端评估的显式调用与隐式调用

or

2) 重写 LINQ 查询以不需要客户端评估

你可以像这样做第一件事:

public override ICollection<ContactDetailModel> GetAll(ICollection<int> ids)
{
    return _context
        .Set<TEntity>()
        .IgnoreDeletedEntities()
        .ToList()                
        .Where(x => ids.Distinct().Contains(x.ContactId))                
        .Select(EntityToDTOMapper)
        .ToList();
}

请注意显式调用ToList after IgnoreDeletedEntities,需要这样做才能显式切换到客户端评估,以便您的Where语句将正确执行并且不会抛出任何错误。这是因为x => ids.Distinct().Contains(x.ContactId)您的 EF 版本无法将其转换为 SQL(或其他形式)。

第 2 个问题可以这样解决:

public override ICollection<ContactDetailModel> GetAll(ICollection<int> ids)
{
    ids = ids.Distinct();
    return _context
        .Set<TEntity>()
        .IgnoreDeletedEntities()
        .Where(x => ids.Contains(x.ContactId))
        .Select(EntityToDTOMapper)
        .ToList();
}

请注意我如何移动使用ids.Distinct()来自Where到顶部,因为这是 EF 无法翻译的部分

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

EF Core 3.1 引发 Contains 异常 的相关文章

随机推荐

  • 滚动滞后差异

    好的 我希望在 R 中创建滚动滞后差异 vec lt c 43 79979 44 04865 44 17308 44 54638 44 79524 44 79524 44 79524 44 42195 44 54638 44 79524 4
  • 初始化本地安装的 ESLint 后节点模块消失

    在我最初的反应应用程序中 由react native init project name 在我的项目文件夹中 我通过以下方式在本地安装 ESLintyarn add eslint dev 然后我通过以下方式初始化我的配置 node modu
  • 每日本地通知不起作用

    我的问题是我正在尝试安排每天在特定时间发出的通知 这是我的代码 import SwiftUI struct notifView View var body some View VStack VStack Button Request Per
  • 使用jquery改变li的背景颜色

    我想改变当鼠标经过它时包含锚点的 li 的颜色 我这样做 ul li class sonItem a href son 1 a li li class sonItem a href son 2 a li ul 而 jquery 是 docu
  • 如何在 bash 中一遍又一遍地运行命令直到成功?

    我有一个脚本 想向用户询问一些信息 但在用户填写此信息之前 脚本无法继续 以下是我尝试将命令放入循环中以实现此目的 但由于某种原因它不起作用 echo Please change password while passwd do echo
  • 数组中出现次数最多的元素 (bash 3.2)

    在使用 bash 的 shell 脚本中 我想找到数组中最常出现的数字并将结果存储在变量 result 中 该数组可以有任意数量的值 如果返回多个结果 那么我想选择最小的数字 我知道 bash 可能不是最好的工具 并且我愿意接受在 Mac
  • PHP 的 filter_var FILTER_VALIDATE_EMAIL 真的有效吗?

    在阅读了各种帖子后 我决定不使用 REGEX 来检查电子邮件是否有效 而是简单地使用 PHP 内置的 filter var 函数 它似乎工作正常 直到它开始告诉我一封电子邮件无效 因为我里面有一个号码 ie 电子邮件受保护 有效 同时 电子
  • 如何强制在 Visual Studio 2013 中打开解决方案文件 (SLN)?

    尝试在 VS 2013 中显式打开 VS 2012 解决方案 SLN 文件 会成功 只需在 Windows 资源管理器中双击它 仍然会在 VS 2012 中打开它 我读了 Visual Studio 2012 无法转换 vs2010 解决方
  • 遍历 XML 文件中的所有节点

    我想遍历 XML 文件中的所有节点并打印它们的名称 做这个的最好方式是什么 我正在使用 NET 2 0 您可以使用Xml文档 一些 XPath 也很有用 只是一个简单的例子 XmlDocument doc new XmlDocument d
  • 创建一个映射来调用 Spark Dataframe 的每一行的 POJO

    我在 R 中构建了一个 H2O 模型并保存了 POJO 代码 我想使用 POJO 在 hdfs 中对 parquet 文件进行评分 但我不知道如何去做 我计划将 parquet 文件读入 Spark scala SparkR PySpark
  • 在java中编写unicode(Sindhi)的keyListener的实现问题

    我想通过实现 keyListener 来使用 unicodejTextField这样 textField addKeyListener new KeyListener Override public void keyTyped KeyEve
  • 如何以编程方式获取在 UWP 应用清单中启用的所有功能

    我想要创建一个库 并且需要以编程方式检查使用我的库的 UWP 应用程序中启用了哪些功能 怎么做 直接将 appxmanifest 作为 XML 文件读取是此处的方法 像这样的东西 var doc XDocument Load AppxMan
  • Jenkins - 一个版本有多少个 CI/CD 管道?

    对于任何版本 使用下面的 Git 工作流程 对于持续交付 我的理解是 需要创建两条Jenkins管道 如下所示 1 构建在每个合并时触发的管道Feature分支 绿色 进入Develop分支 紫色 管道将推product x y snaps
  • Swift NSDate ISO 8601 格式

    我正在 Swift 中处理日期格式 并尝试将字符串日期转换为 NSDate 将 NSSate 转换为字符串日期 ISO 8601 格式 这是我的代码 let stringDate 2016 05 14T09 30 00 000Z ISO 8
  • Android:相机模式打开时返回按钮不起作用

    在我的应用程序中 有一个照片按钮 当我单击该按钮时 应用程序以相机模式打开 并且在捕获照片后 它将返回到布局上并显示在此布局上捕获的照片 但是当应用程序处于相机模式并且当我按下返回按钮时 应用程序将停止工作它显示 应用程序 AppName
  • java中如何查找一个字符串对象重复了多少次?

    我必须字符串对象 String first Some object that has a loop in it object String second object 我需要做的是找出第二个对象在第一个对象中重复了多少次 你能告诉我该怎么做
  • 当用户单击网页上的链接时,打开 Google 地球并加载特定的 KML 文件

    我目前正在开发一个网站 该网站在 Google 地图中显示地图数据 但也有一个在 Google 地球中显示地图数据的链接 要在 Google 地球中查看此数据 用户单击链接 下载文件 然后使用 Google 地球打开该文件 有没有一种方法可
  • 在 Python 中子类化小部件以与 Qt Designer 一起使用的最简单方法

    我正在使用 PyQt5 构建一个应用程序 大部分 GUI 是使用 Qt Designer 构建的 我有一些 UI 元素基本上做同样的事情 将它们的代码移动到从基类继承的类中 而基类又从 QTableWidget 继承 似乎是明智的 这看起来
  • 如何使用javascript来交换html中的swf?

    我在 html 页面中嵌入了一个 swf 但是当我单击 html 中的按钮时 我希望它交换到另一个 swf 我使用 swfobject js 来嵌入 swf 并使用原型来编写 javascript 我以为我可以做到这一点 movie val
  • EF Core 3.1 引发 Contains 异常

    我最近将项目代码更新为 NET Core 3 1 和 EF Core 3 1 现在我的大部分 linq 查询都停止了 EX public override ICollection