c# - 如何使用 Orchard CMS ContentManager 运行 LINQ 子查询?休眠问题?

标签 c# asp.net-mvc linq orchardcms linq-to-nhibernate

我正在尝试使用 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](Expression1 predicate, ICriteria bindCriteria) in c:\TFS\MySite\Source\Site\src\Orchard\ContentManagement\DefaultContentQuery.cs:line 104 at Orchard.ContentManagement.DefaultContentQuery.Where[TRecord](Expression1 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(Expression1 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, IDictionary2 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/

相关文章:

asp.net-mvc - 在单个事务上包装成员资格提供程序和 dbcontext

c# - MVC 强类型 IQueryable<IGrouping<TKey, TElement>> 模型

c# - Queryable.Single 上的 IndexOutOfRangeException

c# - FileInfo.Length 大于 0 但文件为空?

c# - 使用 WCF 服务开发 iOS 应用程序

c# - 使用 Emailmessage 类检索邮件正文

c# - 扩展 HtmlHelper 类 asp.net mvc4

c# - 根据数据库动态改变div的颜色

c# - 遍历一次性对象

c# - 我如何更新数据库与 EF 的关联