在使用提供程序(例如 LINQ to NHibernate)时,在 F# 中使用 LINQ 查询的正确方法是什么,以便与 C# 中的工作方式相同(相同的 AST)?
我的具体问题是将查询转换为 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
但是using.First(fun someEntity -> someEntity.SomeReferenceType <> null)
可以正常工作,这导致了上面的结论:在 using 的情况下,AST 的生成方式不同.HasValue
。