我有以下代码:
private void Import(DbSetdbEntities, 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.ObjectQuery1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery1.CreateValue()
at System.Lazy1.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable1 source)
at CLAP.Models.Import.ImportMapping.ImportBase1 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)
有没有人知道如何解决这个错误?
您应该使用.FirstOrDefault()
而NULL
不会在数据集中没有实体时返回:
bool hasElement = dbe.FirstOrDefault() != null;
您的代码中的另一个可能的问题是您使用的自定义IsEqualRecord
方法应该只包含可以转换为SQL的代码.