实体框架在调用Any或Count后抛出NotSupportedException



我得到了以下代码:

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:

系统。异常:无法将实体映射到数据库。映射器:[CuttingToolImport];行号:[153]---->系统。NotSupportedException:方法"First"只能用作最终查询操作。请考虑在此实例中使用方法"FirstOrDefault">
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。FirstTranslator。TranslateUnary(ExpressionConverter父级、DbExpression操作数、MethodCallExpression调用)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。TranslateExpression(表达式linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。EqualsTranslator。TypedTranslate(ExpressionConverter父级,BinaryExpression linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。BinaryTranslator。TypedTranslate(ExpressionConverter父级,BinaryExpression linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。TranslateExpression(表达式linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。TranslateLambda(LambdaExpression lambda,DbExpression输入)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。OneLambda转换器。翻译(ExpressionConverter父级、MethodCallExpression调用、DbExpression&source、DbExpressionBinding&sourceBinding、DbExpressions&lambda)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。OneLambda转换器。翻译(ExpressionConverter父级,MethodCallExpression调用)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。TranslateExpression(表达式linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。聚合转换器。翻译(ExpressionConverter父级,MethodCallExpression调用)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。MethodCallTranslator。TypedTranslate(ExpressionConverter父级,MethodCallExpression linq)
在系统中。数据实体果心对象。ELinq。ExpressionConverter。Convert()
位于系统。数据实体果心对象。ELinq。ELinqQueryState。GetExecutionPlan(可为空的1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery
1.<>c_DisplayClassb.b_a()
在系统中。数据实体果心对象。ObjectContext。ExecuteInTransaction[T](函数1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery
1.<>c_DisplayClassb.b_9()
在系统上。数据实体SqlServer。默认SqlExecutionStrategy。在系统上执行[TResult](函数1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery
1.GetResults(可为空的1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery
1.GetEnumerator>b_0()
。Lazy1.CreateValue()
at System.Lazy
1.系统中的LazynitValue()
。数据实体内部的LazyEnumerator1.MoveNext()
at System.Linq.Enumerable.Single[TSource](IEnumerable
1源)
。林克。可查询。计数[TSource](IQueryable1 source)
at CLAP.Models.Import.ImportMapping.ImportBase
2.导入(DbSet1 dbEntities, IEnumerable1实体,ClapEntities上下文)
---内部异常堆栈跟踪结束---

如您所见,Any()扩展(或Count()扩展)使用内部First()扩展,这是不允许的。我不知道怎样才能纠正那个错误。

正是这个代码已经在实体框架版本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)

有人知道如何解决那个错误吗?

您应该使用.FirstOrDefault(),当数据集中没有实体时,它将返回NULL

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

代码中另一个可能的问题是,您使用的是自定义IsEqualRecord方法,该方法应仅包含可翻译为SQL代码。

相关内容

  • 没有找到相关文章

最新更新