簡體   English   中英

NHibernate 創建條件,在具有可為空外鍵的相關表上添加限制

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

我使用 NHibernate (5.2.5) 在 .NET core 2.2 中開發一個 Api 項目

表 A 具有來自表 B 的可為空的外鍵

在此處輸入圖像描述 在此處輸入圖像描述

我需要創建一個條件來過濾表 A,使用指向表 B 的可為空的外鍵(不為空),其中表 B 中的狀態為 3

這是我嘗試過的東西:

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

還有 and 運算符

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

但這是我得到的錯誤

在 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 在 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 在 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 同步()\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));

或者如果屬性在編譯時已知,則使用 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