具有嵌套的.Any()条件的NHibernate LINQ查询

具有嵌套的.Any()条件的NHibernate LINQ查询,linq,nhibernate,Linq,Nhibernate,以下是我的课程: class User { IList<UserRedemptionCode> UserRedemptions; } class UserRedemptionCode { string Code; } class Course { IList<CourseRedemptionCode> CourseRedemptions; } class CourseRedemptionCode { string Code;

以下是我的课程:

class User
{
    IList<UserRedemptionCode> UserRedemptions;
}

class UserRedemptionCode
{
    string Code;
}

class Course
{
    IList<CourseRedemptionCode> CourseRedemptions;
}

class CourseRedemptionCode
{
    string Code;
    string SomeData;
}
类用户
{
IList用户赎回;
}
类UserRedemptionCode
{
字符串代码;
}
班级课程
{
IList课程豁免;
}
类CourseDemptionCode
{
字符串代码;
字符串数据;
}
我想检索与用户关联的兑换代码匹配的所有课程。以下是我目前正在拨打的电话:

IQueryable<Course> query = Courses.Where(
    course => course.CourseRedemptions.Any(
        cr => user.UserRedemptions.Any(rc => cr.Code == rc.Code));
IQueryable query=课程。其中(
课程=>course.CourseRedemptions.Any(
cr=>user.UserRedemptions.Any(rc=>cr.Code==rc.Code));
但是,这似乎不适用于NHibernate。我有一个例外:

System.NotSupportedExceptionSpecified method is not supported.
  at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
  at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
  at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
  at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
  at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
  at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
  at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
  at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
  at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
  at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
  at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
  at Remotion.Linq.QueryableBase`1.GetEnumerator()
  at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
  at System.Web.Http.Filters.EnumerableEvaluatorFilter.Convert[T](Object input)
  at System.Web.Http.Filters.EnumerableEvaluatorFilter.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
  at System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext, HttpResponseMessage response, Exception exception)
  at System.Web.Http.Filters.ActionFilterAttribute.<>c__DisplayClass4.<System.Web.Http.Filters.IActionFilter.ExecuteActionFilterAsync>b__2(HttpResponseMessage response)
  at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass2e`2.<Then>b__2d(Task`1 t)
  at System.Threading.Tasks.TaskHelpersExtensions.ThenImpl[TTask,TOuterResult](TTask task, Func`2 continuation, CancellationToken cancellationToken)
System.NotSupportedExceptionSpecified方法不受支持。
位于NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
在NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode树)中
在NHibernate.Hql.Ast.ANTLR.astpromphicprocessor.Process()中
位于NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode Ast、字符串查询标识符、字符串集合角色、布尔值浅型、IDictionary`2过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串查询标识符、IQueryExpression查询表达式、字符串集合角色、布尔浅层、IDictionary`2过滤器、ISessionFactoryImplementor工厂)
在NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅值,IDictionary`2 enabledFilters)
位于NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression,布尔浅层)
位于NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
在NHibernate.Linq.DefaultQueryProvider.PrepareQuery(表达式、IQuery和查询、NhLinqExpression和nhQuery)
在NHibernate.Linq.DefaultQueryProvider.Execute(表达式)
在NHibernate.Linq.DefaultQueryProvider.Execute[TResult](表达式)
at Remotion.Linq.QueryableBase`1.GetEnumerator()
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
位于System.Web.Http.Filters.EnumerableEvaluatorFilter.Convert[T](对象输入)
位于System.Web.Http.Filters.EnumerableEvaluatorFilter.OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
在System.Web.Http.Filters.ActionFilterAttribute.CallOnActionExecuted(HttpActionContext actionContext,HttpResponseMessage响应,异常)
在System.Web.Http.Filters.ActionFilterAttribute.c__DisplayClass4.b__2(HttpResponseMessage响应)中
在System.Threading.Tasks.TaskHelperExtensions.c__中显示Class2E`2.b__2d(任务`1T)
在System.Threading.Tasks.TaskHelperExtensions.TheInImpl[TTask,TouteResult](TTask任务,Func`2 continuation,CancellationToken CancellationToken)
还有一个问题,在这个查询中,我得到了一个课程列表,但是我还需要与用户关联的CourseDemptionCode,这样我就可以获得一些数据


有什么想法吗?有没有其他方法来执行此查询?

NHibernate Jira中有几个问题与“PolymorphicQuerySourceDetector”或“Any”匹配,其中一些问题最近已修复,但您没有说明使用的是哪个NHibernate版本

作为替代方案,或者可能更好,尝试以下方法:

var codes = user.UserRedemptions.Select(ur => ur.Code).ToList();

var query = (from c in Courses
             from cr in c.CourseRedemptions
             where codes.Contains(cr.Code)
             select new { c, cr });

请注意,如果多个代码匹配,您将在响应中多次获得相同的过程。您还可以从select语句中删除“cr”,然后在内存中查找匹配的代码。

在尝试Oskar的答案之前,请尝试此操作,因为它可能在SQL中工作,具体取决于映射:

示例-替换:

.Where(u => u.Businesses.Any(ub => trainee.Businesses.Any(tb => tb.Id == ub.Id)))

我刚试过这个,它对我有效。YMMV!
如果是这样的话,它应该是首选,因为它可以创建更简洁的SQL语句并提取更少的数据。

这应该是一个备份计划。它不如
.Where(u => u.Businesses.Any(ub => trainee.Businesses.Contains(ub)))