簡體   English   中英

如何使用Orchard CMS ContentManager運行LINQ子查詢? 休眠問題?

[英]How to run a LINQ sub-query using the Orchard CMS ContentManager? Nhibernate issue?

我正在嘗試使用ContentManager來查詢具有列表中值的內容項。

var matchingItems = _orchardServices.ContentManager.Query<ItemPart, ItemPartRecord>()
.Where(o => !categories.Any() || categories.Any(c => c == o.Category))
.List()
.Select(o => o.ContentItem.As<CommonPart>().Container.ContentItem)
.Distinct();

return matchingItems;

代碼可以很好地編譯,但是當查詢運行時,它會從NHibernate.Linq;中引發空引用異常。

在NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitMethodCall(MethodCallExpression expr)在NHibernate.Linq.Visitors.ExpressionVisitors.ExpressionVisitors。 NHibernate.Linq.Visitors。 NHibernate的.Linq.Visitors.ExpressionVisitor.Visit(Expression exp).NHibernate的.Linq.Visitors.WhereArgumentsVisitor.VisitUnary(UnaryExpression expr)。 (調用NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr)在NHibernate.Linq.Visitors。 Orchard.ContentManagement.DefaultContentQuery.Orchard.ContentManagement.DefaultContentQuery.Where [TRecord](Expression 1 predicate, ICriteria bindCriteria) in c:\\TFS\\MySite\\Source\\Site\\src\\Orchard\\ContentManagement\\DefaultContentQuery.cs:line 104 at Orchard.ContentManagement.DefaultContentQuery.Where[TRecord](Expression NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression expression,QueryOptions queryOptions)處的ExpressionVisitor.Visit(Expression exp) 1 predicate, ICriteria bindCriteria) in c:\\TFS\\MySite\\Source\\Site\\src\\Orchard\\ContentManagement\\DefaultContentQuery.cs:line 104 at Orchard.ContentManagement.DefaultContentQuery.Where[TRecord](Expression c:\\ TFS \\ MySite \\ Source \\ Site \\ src \\ Orchard \\ ContentManagement中的1 predicate, ICriteria bindCriteria) in c:\\TFS\\MySite\\Source\\Site\\src\\Orchard\\ContentManagement\\DefaultContentQuery.cs:line 104 at Orchard.ContentManagement.DefaultContentQuery.Where[TRecord](Expression 1謂詞) \\ DefaultContentQuery.cs:Orchard.ContentManagement.DefaultContentQuery.ContentQuery的第94行2.Orchard.ContentManagement.IContentQuery<T,TR>.Where(Expression c:\\ TFS \\ MySite \\ Source \\ Site \\ src \\ Orchard \\中的2.Orchard.ContentManagement.IContentQuery<T,TR>.Where(Expression 1謂詞) ContentManagement \\ DefaultContentQuery.cs:第318行位於MySite.Items.Services.ItemSearchService.GetItems(ItemSearchFilterRequest過濾器),位於MySite.Items.Controllers.ItemSearchController.ReturnFilteredItemData(ItemSearchFilterViewModel模型),位於lambda_method(Closure,ControllerBase, System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(System.Web.Mvc.ReflectionActionDescriptor.Execute( 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2參數)處的Object [])。 System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)的System.Web.Mvc.Async.AsyncControllerActionInvoker.Async.3。的Async.AsyncControllerActionInvoker.b__39 .Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters。<> c__DisplayClass48.b__41()

在網上查看后,NHibernate似乎無法處理子查詢? 有人知道如何在Orchard CMS中使用ContentManager運行子查詢嗎?

不要在Where子句中使用LINQ表達式。 NHibernate不知道該怎么解釋。

而是使用Contains其中的list方法。

(...).Where(o => categories.Contains(o.Category)) 

NHibernate會正確解釋這點,並將其轉換為IN(...)子句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM