我正在尝试使用 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 抛出空引用异常;
at Hibernate.Linq.Visitors.WhereArgumentsVisitor.GetExistsCriteria(MethodCallExpression expr) at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitMethodCall(MethodCallExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitAndAlsoExpression(BinaryExpression expr) at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitBinary(BinaryExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.ExpressionVisitor.VisitLambda(LambdaExpression lambda) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.WhereArgumentsVisitor.VisitUnary(UnaryExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.RootVisitor.HandleWhereCall(MethodCallExpression call) at NHibernate.Linq.Visitors.RootVisitor.VisitMethodCall(MethodCallExpression expr) at NHibernate.Linq.Visitors.ExpressionVisitor.Visit(Expression exp) at NHibernate.Linq.Visitors.NHibernateQueryTranslator.Translate(Expression expression, QueryOptions queryOptions) at 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
1 predicate) in c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 94 at Orchard.ContentManagement.DefaultContentQuery.ContentQuery2.Orchard.ContentManagement.IContentQuery<T,TR>.Where(Expression
1 predicate) in c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 318 at MySite.Items.Services.ItemSearchService.GetItems(ItemSearchFilterRequest filters) at MySite.Items.Controllers.ItemSearchController.ReturnFilteredItemData(ItemSearchFilterViewModel model) at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary
2 parameters) at System.Web.Mvc.Async.AsyncControllerActionInvoker.b__39(IAsyncResult asyncResult, ActionInvocation innerInvokeState) at System.Web.Mvc.Async.AsyncResultWrapper.WrappedAsyncResult`2.CallEndDelegate(IAsyncResult asyncResult) at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.b__3f() at System.Web.Mvc.Async.AsyncControllerActionInvoker.AsyncInvocationWithFilters.<>c__DisplayClass48.b__41()
网上查了一下,好像NHibernate不能处理子查询?有人知道如何使用 Orchard CMS 中的 ContentManager 运行子查询吗?
最佳答案
不要在 Where
子句中使用 LINQ 表达式。 NHibernate 不知道如何解释它。
相反,使用列表方法Contains
,即。
(...).Where(o => categories.Contains(o.Category))
这将被 NHibernate 正确解释并转换为 IN(...)
子句。
关于c# - 如何使用 Orchard CMS ContentManager 运行 LINQ 子查询?休眠问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25328062/