2012-05-29 45 views
1

這裏NHibernate的LINQ查詢是什麼我的課是這樣的:嵌套。任何()條件

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) 

還有另外一個問題,在此查詢我回來的課程列表,但我也需要與用戶相關聯的,所以我可以SomeData的CourseRedemptionCode。

任何想法?是否有另一種方法來執行此查詢?

回答

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」,然後在內存中查找匹配的代碼。