我有以下代码:
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);
< p > Any()
扩展方法会抛出一个 NotSupportedException
异常:
System.Exception:无法将实体映射到数据库。Mapper:[CuttingToolImport];Rownumber:[153] ---> System.NotSupportedException:方法“First”只能用作最终查询操作。在这种情况下,请考虑使用方法“FirstOrDefault”。在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.FirstTranslator.TranslateUnary(ExpressionConverter parent, DbExpression operand, MethodCallExpression call)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.EqualsTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.BinaryTranslator.TypedTranslate(ExpressionConverter parent, BinaryExpression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, 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 parent, 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 parent, MethodCallExpression linq)中
在System.Data.Entity.Core.Objects.ELinq.ExpressionConverter.Convert()中
在System.Data.Entity.Core.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable<code>1 forMergeOption)中
在System.Data.Entity.Core.Objects.ObjectQuery<code>1.<>c_<DisplayClassb.b>_a()中
在System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func<code>1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)中
在System.Data.Entity.Core.Objects.ObjectQuery<code>1.<>c_<DisplayClassb.b>_9()中
在System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func<code>1 operation)中
在System.Data.Entity.Core.Objects.ObjectQuery<code>1.GetResults(Nullable<code>1 forMergeOption)中
在System.Data.Entity.Core.Objects.ObjectQuery<code>1..GetEnumerator>b__0()中
在System.Lazy<code>1.CreateValue()中
在System.Lazy</code>1.LazyInitValue()中
在System.Data.Entity.Internal.LazyEnumerator<code>1.MoveNext()中
在System.Linq.Enumerable.Single[TSource](IEnumerable<code>1 source)中
在System.Linq.Queryable.Count[TSource](IQueryable<code>1 source)中
在CLAP.Models.Import.ImportMapping.ImportBase</code>2.Import(DbSet<code>1 dbEntities, IEnumerable<code>1 entities, ClapEntities context)中
--- 内部异常堆栈跟踪的结尾 ---
正如您所看到的,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
方法中完成,因为Any
本身总是有效的。IsEqualRecord
在调用Any
时被执行。 - Gert Arnold