【发布时间】:2014-01-30 08:45:06
【问题描述】:
我有以下代码:
private void Import(DbSet<DBEntity> dbEntities, IEnumerable<ExcelEntity> 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<Func<DBEntity, bool>> IsEqualRecord(ExcelEntity entity, ClapEntities context);
Any() 扩展会抛出 NotSupportedException:
System.Exception:无法将实体映射到数据库。映射器:[CuttingToolImport];行号:[153] ---> System.NotSupportedException:方法“First”只能用作最终查询操作。请考虑在此实例中改用“FirstOrDefault”方法。
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.FirstTranslator.TranslateUnary(ExpressionConverter 父级,DbExpression 操作数,MethodCallExpression 调用)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父级,MethodCallExpression linq)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression 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(Expression linq)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda,DbExpression 输入)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter 父,MethodCallExpression 调用,DbExpression& 源,DbExpressionBinding& sourceBinding,DbExpression& lambda)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父级,MethodCallExpression linq)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.AggregateTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter 父级,MethodCallExpression linq)
在 System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()
在 System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable1 forMergeOption)1.c_DisplayClassb.b_a()
at System.Data.Entity.Core.Objects.ObjectQuery
在 System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)1.c_DisplayClassb.b_9()
at System.Data.Entity.Core.Objects.ObjectQuery
在 System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation)1.GetResults(Nullable
at System.Data.Entity.Core.Objects.ObjectQuery1 forMergeOption)1..GetEnumerator>b__0()
at System.Data.Entity.Core.Objects.ObjectQuery
在 System.Lazy1.CreateValue()1.LazyInitValue()
at System.Lazy
在 System.Data.Entity.Internal.LazyEnumerator1.MoveNext()1 来源)
at System.Linq.Enumerable.Single[TSource](IEnumerable
在 System.Linq.Queryable.Count[TSource](IQueryable1 source)2.Import(DbSet
at CLAP.Models.Import.ImportMapping.ImportBase1 dbEntities, IEnumerable1 个实体,ClapEntities 上下文)
--- 内部异常堆栈跟踪结束 ---
如您所见,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 <X64> (Build 7601: Service Pack 1)
有人知道如何解决这个错误吗?
【问题讨论】:
-
这可能是
IsEqualRecord方法的问题,可能无法翻译成sql。 -
好吧。但是我一个月没有对整个代码进行任何更改。它随时可用。
-
破坏行为的改变是什么?
-
当然这很奇怪,但它必须在你的
IsEqualRecord方法中,因为Any这样总是有效的。IsEqualRecord在调用Any时执行。 -
可以显示
IsEqualRecord的出处吗?
标签: c# sql entity-framework