2017-07-03 7 views
1

私は一般的にヘルパークラスをEntity Frameworkのコア内のいくつかの結果をフィルタリングするためにしようとしているが、私はこのエラーを取得していますし、私にはわからない理由:一般的なLINQクエリの非サポート例外:式を解析できませんでした

NotSupportedException: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable'1[eVendCustomerDAL.DomainModels.Bin]).Any(__funcTest_0)': The given arguments did not match the expected arguments: Object of type 'System.Linq.Expressions.TypedParameterExpression' cannot be converted to type 'System.Linq.Expressions.LambdaExpression'.

そして、このエラーが起こっているところです。

public virtual Revision<DTO> GetStateAsRevision(
     Expression<Func<Domain, bool>> query) { 
     //get all the stateful data from the database 
     DbSet<Domain> oriSet = db.Set<Domain>(); 
     //query all the data 
     List<Domain> oriList = oriSet.Where(query).ToList(); 

エラーは、私が通過押してるqueryパラメータの発生するようですし、それが唯一のランタイムとして発生します。それがジェネリックであるという事実が原因であるかどうかは分かりません。ジェネリックはクラスであり、インターフェースでもありません。

where DTO : BaseRevisionDTO 
where Domain : BaseTrackedObject 
where DomainRevision : BaseRevision 

私は、次のスニペットを使用して式を作成:

private Expression<Func<Domain, bool>> GetDomainSearchExpression(Func<Domain, bool> shortFunction) { 
     DbSet<Domain> modelTable = CustomerContext.Set<Domain>(); 

     Expression<Func<Domain, bool>> expr = 
     d => 
     modelTable.Any(shortFunction); 

     return expr; 
    } 

    protected override Func<DomainModels.Bin, bool> GetDomainSearchFunction() { 
     return x => x.Station.Machine.UniqueId == MachineID; 
    } 

編集1:

をだから私はそうのように、上記のコードを呼び出す場合:

 GetStateAsRevision(GetDomainSearchExpression(GetDomainSearchFunction())); 

を次の場所でエラーが発生します:

 List<Domain> oriList = oriSet.Where(query).ToList(); 

そして、これは全体のスタックトレースです:

NotSupportedException: Could not parse expression 'value(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[eVendCustomerDAL.DomainModels.Bin]).Any(__shortFunction_0)': The given arguments did not match the expected arguments: Object of type 'System.Linq.Expressions.TypedParameterExpression' cannot be converted to type 'System.Linq.Expressions.LambdaExpression'. 
Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.CreateExpressionNode(Type nodeType, MethodCallExpressionParseInfo parseInfo, Object[] additionalConstructorParameters) 
Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.Parse(string associatedIdentifier, IExpressionNode source, IEnumerable<Expression> arguments, MethodCallExpression expressionToParse) 
Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseMethodCallExpression(MethodCallExpression methodCallExpression, string associatedIdentifier) 
Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseTree(Expression expressionTree) 
Remotion.Linq.Parsing.Structure.QueryParser.GetParsedQuery(Expression expressionTreeRoot) 
Remotion.Linq.Parsing.ExpressionVisitors.SubQueryFindingExpressionVisitor.Visit(Expression expression) 
System.Linq.Expressions.ExpressionVisitor.VisitLambda<T>(Expression<T> node) 
System.Linq.Expressions.Expression.Accept(ExpressionVisitor visitor) 
Remotion.Linq.Parsing.ExpressionVisitors.SubQueryFindingExpressionVisitor.Visit(Expression expression) 
System.Linq.Enumerable+SelectListPartitionIterator.ToArray() 
System.Linq.Enumerable.ToArray<TSource>(IEnumerable<TSource> source) 
Remotion.Linq.Parsing.Structure.MethodCallExpressionParser.Parse(string associatedIdentifier, IExpressionNode source, IEnumerable<Expression> arguments, MethodCallExpression expressionToParse) 
Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseMethodCallExpression(MethodCallExpression methodCallExpression, string associatedIdentifier) 
Remotion.Linq.Parsing.Structure.ExpressionTreeParser.ParseTree(Expression expressionTree) 
Remotion.Linq.Parsing.Structure.QueryParser.GetParsedQuery(Expression expressionTreeRoot) 
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.CompileQueryCore<TResult>(Expression query, INodeTypeProvider nodeTypeProvider, IDatabase database, ILogger logger, Type contextType) 
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler+<>c__DisplayClass19_0.<CompileQuery>b__0() 
Microsoft.EntityFrameworkCore.Query.Internal.CompiledQueryCache.GetOrAddQueryCore<TFunc>(object cacheKey, Func<Func<QueryContext, TFunc>> compiler) 
Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.Execute<TResult>(Expression query) 
Remotion.Linq.QueryableBase.GetEnumerator() 
System.Collections.Generic.List..ctor(IEnumerable<T> collection) 
System.Linq.Enumerable.ToList<TSource>(IEnumerable<TSource> source) 
eVendWebAPI.Helpers.DALHelpers.GetRevisionHelper.GetStateAsRevision(Expression<Func<DomainModel, bool>> query) in GetRevisionHelper.cs 
+ 
      List<DomainModel> oriList = oriSet.Where(query).ToList(); 
eVendWebAPI.Helpers.DALHelpers.GetRevisionHelper.GetRevision(Expression<Func<DomainModel, bool>> query) in GetRevisionHelper.cs 
+ 
      return GetStateAsRevision(query); 
eVendWebAPI.Areas.Customer.Controllers.Base.BaseAPIRevisionController.Get() in BaseAPIRevisionController.cs 
+ 
      return Ok(helper.GetRevision(searchExpr)); 
lambda_method(Closure , object , Object[]) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeActionMethodAsync>d__27.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeNextActionFilterAsync>d__25.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeNextResourceFilter>d__22.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker+<InvokeAsync>d__20.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Builder.RouterMiddleware+<Invoke>d__4.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware+<Invoke>d__18.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware+<Invoke>d__18.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware+<ExecuteWithFilter>d__7.MoveNext() 
System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+<Invoke>d__7.MoveNext() 
+1

'shortFunction'は' Func <> 'であり、' Expression'ではなく、SQLに変換できません。代わりに 'Expression >'型にしてみてください。 – NetMage

+0

こんにちは、ありがとう!その時のことは何ですか? – Smithy

答えて

1

あなたshortFunctionので、それはSQLに変換することはできませんFunc<>ないExpressionです。その代わりにタイプExpression<Func<>>にしてみてください。

C#コンパイラは、2つのタイプにラムダを変換するための特殊な論理を有する - 所望の結果型はFunc<>ある場合、それは、コンパイルされたコードに変換した場合に、それはコードを表すExpressionツリーに変換Expression場合、結果のタイプ(LINQ用のチートが追加されました)。データプロバイダは、その式ツリーを読み取り、問題のデータベース(SQLなど)のコードを発行できますが、コンパイルされたILコードを逆コンパイルして、別の言語で出力できるものに戻すことはできません。

関連する問題