Quelle est la bonne façon d'utiliser les requêtes LINQ en F # lors de l'utilisation d'un fournisseur (LINQ to NHibernate par exemple) afin de travailler de la même manière qu'en C# (même AST)?Comment utiliser un fournisseur LINQ à partir de F #?
Mon problème spécifique est que la traduction d'une requête en F # génère une erreur alors que celle en C# fonctionne. Cela peut être dû au fait que F # ne génère pas le même AST. Roslyn fournit une extension Visual Studio AST pour C#, mais je ne connais aucun visualiseur AST pour F #.
Ayant le travail suivant C# requête:
.First(someEntity => someEntity.SomeNullableInt.HasValue);
quand il est traduit à F #:
.First(fun someEntity -> someEntity.SomeNullableInt.HasValue)
il échoue avec l'erreur suivante:
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
L'utilisation .First(fun someEntity -> someEntity.SomeReferenceType <> null)
fonctionne correctement si, ce qui conduit à la conclusion ci-dessus: AST est généré différemment dans le cas e d'utiliser .HasValue
.