调用Any或Count后,Entity Framework会抛出NotSupportedException

 推广中医 发布于 2023-01-30 14:05

我有以下代码:

private void Import(DbSet dbEntities, IEnumerable entities, ClapEntities context)
{
    foreach (var me in entities)
    {
        try
        {
            var dbe = dbEntities.Where(IsEqualRecord(me, context));
            bool hasElement = dbe.Any(); //Line which throws the exception
        }
        catch (Exception ex)
        {
            //...
        }
    }
}

protected abstract Expression> IsEqualRecord(ExcelEntity entity, ClapEntities context);

Any()扩展抛出了NotSupportedException:

System.Exception:无法将实体映射到数据库.映射器:[CuttingToolImport]; Rownumber:[153] ---> System.NotSupportedException:方法'First'只能用作最终查询操作.请考虑在此实例中使用方法"FirstOrDefault".
at System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.FirstTranslator.TranslateUnary(ExpressionConverter parent,DbExpression操作数,MethodCallExpression调用)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter)母体,MethodCallExpression LINQ)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式LINQ)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter父,BinaryExpression LINQ)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter父,BinaryExpression LINQ)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式LINQ)
在System.Data. Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression拉姆达,DbExpression输入)
在System.Data.Entity.Core.Objects.ELinq.ExpressionC
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression call)中的onverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent,MethodCallExpression call,DbExpression&source,DbExpressionBinding&sourceBinding,DbExpression&lambda).
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter父,MethodCallExpression LINQ)
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(表达式LINQ)
在System.Data. 在System的
System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent,MethodCallExpression linq)
中的Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent,MethodCallExpression call). Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
在System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(可空1.<> C_ DisplayClassb.b _a() 在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction [T](Func键1 <> C_ DisplayClassb.b _9() 在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute [TResult](Func键1.GetResults(可空1..GetEnumerator> b__0() 在System.Lazy 1.LazyInitValue() 在 System.Linq.Queryable.Count [TSource]的System.Data.Entity.Internal.LazyEnumerator 1 source)(IQueryable 2.Import(DbSet 1实体,ClapEntities上下文) ---内部异常堆栈跟踪结束--- 1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery

1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery

1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery
1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery

1.CreateValue()
at System.Lazy

1.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable

1 source)
at CLAP.Models.Import.ImportMapping.ImportBase
1 dbEntities, IEnumerable

如您所见,Any()扩展(或Count()扩展)使用First()不允许的扩展内部.我不知道如何解决这个错误.

确切地说,这段代码已经使用Entity Framework版本5或6工作了很多个月

Microsoft SQL Server 2012 - 11.0.2100.60 (X64) Express Edition (64-bit) on
Windows NT 6.1  (Build 7601: Service Pack 1)

有没有人知道如何解决这个错误?

1 个回答
  • 您应该使用.FirstOrDefault()NULL不会在数据集中没有实体时返回:

    bool hasElement = dbe.FirstOrDefault() != null;
    

    您的代码中的另一个可能的问题是您使用的自定义IsEqualRecord方法应该包含可以转换为SQL的代码.

    2023-01-30 14:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有