注册

EFCore驱动库无法正确翻译部分查询,产生InvalidCastException异常

飞羽流星 2023/04/24 1080 1

使用达梦EFCore 6.0执行以下查询时会产生异常
查询是作用是从MY_TABLE表中查询出所有的TEXT_FIELD字段值,并从中截取其中第一个"_"符号后的文本

myDbContext.MY_TABLE
    .Select(item => item.TEXT_FIELD
        .Substring(item.TEXT_FIELD.IndexOf('_') + 1))
    .ToList()

会产生如下异常

System.InvalidCastException:“Unable to cast object of type 'NotTranslatedExpressionType' to type 'Microsoft.EntityFrameworkCore.Query.SqlExpressions.SqlExpression'.”
在 Microsoft.EntityFrameworkCore.Dm.Query.Internal.DmSqlTranslatingExpressionVisitor.VisitBinary(BinaryExpression binaryExpression)
   在 System.Linq.Expressions.BinaryExpression.Accept(ExpressionVisitor visitor)
   在 System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   在 System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.TranslateInternal(Expression expression)
   在 Microsoft.EntityFrameworkCore.Query.RelationalSqlTranslatingExpressionVisitor.Translate(Expression expression)
   在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Visit(Expression expression)
   在 Microsoft.EntityFrameworkCore.Query.Internal.RelationalProjectionBindingExpressionVisitor.Translate(SelectExpression selectExpression, Expression expression)
   在 Microsoft.EntityFrameworkCore.Query.RelationalQueryableMethodTranslatingExpressionVisitor.TranslateSelect(ShapedQueryExpression source, LambdaExpression selector)
   在 Microsoft.EntityFrameworkCore.Query.QueryableMethodTranslatingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
   在 System.Linq.Expressions.MethodCallExpression.Accept(ExpressionVisitor visitor)
   在 System.Linq.Expressions.ExpressionVisitor.Visit(Expression node)
   在 Microsoft.EntityFrameworkCore.Query.QueryCompilationContext.CreateQueryExecutor[TResult](Expression query)
   在 Microsoft.EntityFrameworkCore.Storage.Database.CompileQuery[TResult](Expression query, Boolean async)
   在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore[TResult](IDatabase database, Expression query, IModel model, Boolean async)
   在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass9_0`1.&lt;Execute>b__0()
   在 Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQuery[TResult](Object cacheKey, Func`1 compiler)
   在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute[TResult](Expression query)
   在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryProvider.Execute[TResult](Expression expression)
   在 Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1.GetEnumerator()
   [程序执行查询]

该异常描述为EF实现中未正确处理"不翻译SQL的语句",代码尝试将"不翻译SQL的语句"作为"SQL翻译语句"进行处理。

目前代码可以改写成来绕过这个错误翻译问题。

myDbContext.MY_TABLE
    .Select(item => item.TEXT_FIELD)
    .AsEnumerable()
    .Select(txt => txt.Substring(txt.IndexOf('_') + 1))
    .ToList()

但是对于更复杂的查询,此内部异常会导致问题难以排查。

回答 0
暂无回答
扫一扫
联系客服