1

这是我的课程的样子:

class User
{
    IList<UserRedemptionCode> UserRedemptions;
}

class UserRedemptionCode
{
    string Code;
}

class Course
{
    IList<CourseRedemptionCode> CourseRedemptions;
}

class CourseRedemptionCode
{
    string Code;
    string SomeData;
}

我想检索与与用户关联的兑换代码匹配的所有课程。这是我正在进行的当前 IQuerable 调用:

IQueryable<Course> query = Courses.Where(
    course => 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)

还有另一个问题,在此查询中,我返回了课程列表,但我还需要与用户关联的 CourseRedemptionCode,以便获取 SomeData。

有任何想法吗?还有另一种方法可以进行此查询吗?

4

2 回答 2

2

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”,然后在内存中查找匹配的代码。

于 2012-05-29T08:39:34.857 回答
0

在您尝试 Oskar 的答案之前,请尝试此操作,因为根据映射,它可能在 SQL 中工作:

示例 - 替换:

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

.Where(u => u.Businesses.Any(ub => trainee.Businesses.Contains(ub)))

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

于 2019-02-06T04:10:18.333 回答