在使用提供程序(例如LINQ到NHibernate)時,在F#中使用LINQ查詢的正確方法是什麼,以便與C#(相同的AST)中的工作方式相同?如何使用F#提供的LINQ提供程序?
我的具體問題是,將查詢轉換爲F#會在C#工作時拋出錯誤。這可能是由於F#沒有生成相同的AST引起的。 Roslyn爲C#提供了一個Visual Studio AST可視化擴展,但我不知道任何F#的AST查看器。
具有以下工作C#查詢:
.First(someEntity => someEntity.SomeNullableInt.HasValue);
當轉換爲F#:
.First(fun someEntity -> someEntity.SomeNullableInt.HasValue)
失敗,出現以下錯誤:
System.NotSupportedException: Boolean Invoke(System.Nullable`1[System.Int32])
> at NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitMethodCallExpression(MethodCallExpression expression)
at NHibernate.Linq.Visitors.QueryModelVisitor.VisitWhereClause(WhereClause whereClause, QueryModel queryModel, Int32 index)
at Remotion.Linq.QueryModelVisitorBase.VisitBodyClauses(ObservableCollection`1 bodyClauses, QueryModel queryModel)
at Remotion.Linq.QueryModelVisitorBase.VisitQueryModel(QueryModel queryModel)
at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
at NHibernate.Linq.NhLinqExpression.Translate(ISessionFactoryImplementor sessionFactory, Boolean filter)
at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
...
Stopped due to error
使用.First(fun someEntity -> someEntity.SomeReferenceType <> null)
作品雖然正確,這導致了上面的結論:AST在cas中產生不同使用.HasValue
。