简体   繁体   English

NHibernate 创建条件,在具有可为空外键的相关表上添加限制

[英]NHibernate create criteria, add Restrictions on related table with nullable foreign key

I work on a Api project in .NET core 2.2 with NHibernate (5.2.5)我使用 NHibernate (5.2.5) 在 .NET core 2.2 中开发一个 Api 项目

Table A has nullable foreign key from table B表 A 具有来自表 B 的可为空的外键

在此处输入图像描述 在此处输入图像描述

I need to create a criteria to filter Table A, using a nullable foreign key (which is not null) that points to Table B, where the Status in Table B is 3我需要创建一个条件来过滤表 A,使用指向表 B 的可为空的外键(不为空),其中表 B 中的状态为 3

This is something what I have tried:这是我尝试过的东西:

var criteria = _session.CreateCriteria<AgencyAgreement>();criteria.Add(Restrictions.Eq("BookingCartItem.Status", (int)BookingCartStatus.Cancelled));

also with and operator还有 and 运算符

criteria.Add(Restrictions.And(Restrictions.IsNotNull("BookingCartItem"), Restrictions.Eq("BookingCartItem.Status", (int)BookingCartStatus.Cancelled)));

but this is what I get as Error但这是我得到的错误

at NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName)\r\n at NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(String alias, String propertyName)\r\n at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumnsUsingProjection(ICriteria subcriteria, String propertyName)\r\n at NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery, ICriteria criteria, String propertyName, Object value, ICriterion critertion)\r\n at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)\r\n at NHibernate.Criterion.LogicalExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)\r\n at NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition()\r\n at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, ID在 NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns(String propertyName)\r\n 在 NHibernate.Persister.Entity.AbstractPropertyMapping.ToColumns(字符串别名,字符串 propertyName)\r\n ICriteria 子标准,字符串 propertyName)\r\n 在 NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName(ICriteriaQuery criteriaQuery,ICriteria 标准,字符串 propertyName,对象值,ICriterion 标准)\r\n 在 NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria 标准, ICriteriaQuery criteriaQuery)\r\n 在 NHibernate.Criterion.LogicalExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery)\r\n 在 NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition()\r\n 在 NHibernate.Loader.Criteria.CriteriaJoinWalker ..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, ID ictionary2 enabledFilters)\r\n at NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable persister, ISessionFactoryImplementor factory, CriteriaImpl rootCriteria, String rootEntityName, IDictionary2 enabledFilters)\r\n at NHibernate.Impl.SessionImpl.ListAsync(CriteriaImpl criteria, IList results, CancellationToken cancellationToken)\r\n at NHibernate.Impl.CriteriaImpl.ListAsync(IList results, CancellationToken cancellationToken)\r\n at NHibernate.Impl.CriteriaImpl.ListAsync[T](CancellationToken cancellationToken)\r\n at HASELT.merakzy.Services.Features.Documents.QueryTravelAgreements.Handler.Handle(Request request, CancellationToken cancellationToken) in C:\Users\Asus\Desktop\merakzy-sourcecode\merakzy-master\src\HASELT.merakzy.Services\Features\AgencyDocuments\QueryTravelAgreements.cs:line 115\r\n at MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 next)\r\n at MediatR.Pipeline.RequestPrePr ictionary2 enabledFilters)\r\n 在 NHibernate.Loader.Criteria.CriteriaLoader..ctor(IOuterJoinLoadable 持久性,ISessionFactoryImplementor 工厂,CriteriaImpl rootCriteria,字符串 rootEntityName,IDictionary2 enabledFilters)\r\n 在 NHibernate.Impl.SessionImpl.ListAsync(CriteriaImpl 标准, IList 结果,CancellationToken cancellationToken)\r\n 在 NHibernate.Impl.CriteriaImpl.ListAsync(IList 结果,CancellationToken cancellationToken)\r\n 在 NHibernate.Impl.CriteriaImpl.ListAsync[T](CancellationToken cancellationToken)\r\n 在 HASELT .merakzy.Services.Features.Documents.QueryTravelAgreements.Handler.Handle(Request request, CancellationToken cancellationToken) 在 C:\Users\Asus\Desktop\merakzy-sourcecode\merakzy-master\src\HASELT.merakzy.Services\Features\AgencyDocuments \QueryTravelAgreements.cs: 行 115\r\n 在 MediatR.Pipeline.RequestPostProcessorBehavior2.Handle(TRequest 请求,CancellationToken cancellationToken,RequestHandlerDelegate1 接下来)\r\n 在 MediatR.Pipeline.RequestPrePr ocessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 next)\r\n at lambda_method(Closure, Object )\r\n at Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\r\n at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)\r\n at System.Threading.Tasks.ValueTask`1.get_Result()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\r\n at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAs ocessorBehavior2.Handle(TRequest request, CancellationToken cancellationToken, RequestHandlerDelegate1 next)\r\n 在 lambda_method(Closure, Object )\r\n 在 Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable.Awaiter.GetResult()\r\n 在 Microsoft.AspNetCore .Mvc.Internal.ActionMethodExecutor.AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper 映射器、ObjectMethodExecutor 执行器、对象控制器、Object[] 参数)\r\n 在 System.Threading.Tasks.ValueTask`1.get_Result()\r\n 在 Microsoft。在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()\r\n r\n 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)\r\n 在 Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAs ync()\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()同步()\r\n 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextExceptionFilterAsync()

var criteria = _session.CreateCriteria<AgencyAgreement>();
criteria.CreateCriteria(nameof(AgencyAgreement.BookingCartItem))
    .Add(Restrictions.Eq("Status", (int)BookingCartStatus.Cancelled));

or using linq if the properties are known at compile time或者如果属性在编译时已知,则使用 linq

var query = _session.Query<AgencyAgreement>();
query = query.Where(a => a.BookingCartItem.Status == (int)BookingCartStatus.Cancelled);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM