4

C# (同じ AST) と同じように動作するように、プロバイダー (LINQ to NHibernate など) を使用するときに 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)すると正しく動作し、上記の結論につながり.HasValueます。

4

1 に答える 1