我试图使用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抛出一个空引用异常;
在Hibernate.Linq.Visitors.WhereArgumentsVisitor.GetExistsCriteria(MethodCallExpression博览会)在NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitMethodCall(MethodCallExpression博览会)在NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression展览馆)在NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitAndAlsoExpression(BinaryExpression博览会)在NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinary(BinaryExpression博览会( NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression博览会)在NHibernate.Linq.Visitors.ExpressionVisitor.VisitLambda(LambdaExpression lambda)( NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)在NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitUnary(UnaryExpression exp) ( NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp)在NHibernate.Linq.Visitors.RootVisitor.HandleWhereCall(MethodCallExpression call)在NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression exp( NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression表达式,( Orchard.ContentManagement.DefaultContentQuery.WhereTRecord at c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 104 at Orchard.ContentManagement.DefaultContentQuery.WhereTRecord in c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 94 at Orchard.ContentManagement.DefaultContentQuery.ContentQuery
2.Orchard.ContentManagement.IContentQuery<T,TR>.Where(Expression1谓词) c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 318 at MySite.Items.Services.ItemSearchService.GetItems(ItemSearchFilterRequest过滤器( MySite.Items.Controllers.ItemSearchController.ReturnFilteredItemData(ItemSearchFilterViewModel模型)在lambda_method(闭包,( System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2参数)在System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult,ActionInvocation innerInvokeState)在System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult)在System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3f() at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass48.b__41()
在线查看后,NHibernate似乎无法处理子查询?有谁知道我如何使用Orchard中的ContentManager运行子查询?
发布于 2014-08-18 18:47:15
不要在Where子句中使用LINQ表达式。NHibernate不知道如何解释这一点。
相反,在那里使用list方法Contains,即。
(...).Where(o => categories.Contains(o.Category)) 这将由NHibernate正确解释并翻译为IN(...)子句。
https://stackoverflow.com/questions/25328062
复制相似问题