2011-08-09 20 views
2

を返す通常のメソッドを呼び出すことはできません:(NHibernateはLINQのは、私は次のクエリ持っているのIQueryable <T>

public ICollection<AccountAbsence> GetAccountAbsencesByRosters(WorkRoster[] workRosters) 
{ 
    var processedWorkRosters = from workRoster in workRosters 
           select new WorkRoster 
           { 
            Start = DateUtil.SyncToCrmTime(workRoster.Start), 
            End = DateUtil.SyncToCrmTime(workRoster.End), 
            ServicePlan = workRoster.ServicePlan 
           }; 

    return (from absence in GetNonCanceledAbsencesCriteria() 
      where processedWorkRosters.Any(workRoster => workRoster.ServicePlan.Account.Id == absence.Account.Id && ((absence.End.HasValue && absence.End > workRoster.Start && absence.Start < workRoster.End) || (!absence.End.HasValue && absence.Start <= workRoster.End))) 
      select absence).ToList(); 

} 

    private IQueryable<AccountAbsence> GetNonCanceledAbsencesCriteria() 
    { 
     return ActiveRecordLinq.AsQueryable<AccountAbsence>().AsQueryable() 
            .Where(absence => absence.CancelDate == null || absence.CancelReason == null); 
    } 

そして、いくつかの理由GetNonCanceledAbsencesCriteria用)を評価することができません。 LINQプロバイダがこれを理解することができるはずのよう

Message: Specified method is not supported. 
Stack Trace: 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.AstPolymorphicProcessor.Process(IASTNode ast 
ISessionFactoryImplementor factory) 
    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.HQLExpressionQueryPlan.CreateTranslators(String expressionStr 
IQueryExpression queryExpression 
String collectionRole 
Boolean shallow 
IDictionary`2 enabledFilters 
ISessionFactoryImplementor factory) 
    at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr 
IQueryExpression queryExpression 
String collectionRole 
Boolean shallow 
IDictionary`2 enabledFilters 
ISessionFactoryImplementor factory) 
    at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr 
IQueryExpression queryExpression 
Boolean shallow 
IDictionary`2 enabledFilters 
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.NhQueryProvider.PrepareQuery(Expression expression 
IQuery& query 
NhLinqExpression& nhQuery) 
    at NHibernate.Linq.NhQueryProvider.Execute(Expression expression) 
    at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression) 
    at Remotion.Data.Linq.QueryableBase`1.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 
    at Danel.Nursing.Scheduling.Actions.DataServices.AccountAbsenceDataService.GetAccountAbsencesByRosters(WorkRoster[] workRosters) in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling.Actions\DataServices\AccountAbsenceDataService.cs:line 102 
    at Danel.Nursing.Scheduling.Actions.Validators.AccountAbsenceWorkRostersValidator.GetFailedWorkRosters() in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling.Actions\Validators\AccountAbsenceWorkRostersValidator.cs:line 50 
    at Danel.Nursing.Scheduling.Actions.Generators.WorkingJournalsDataGenerator.generateLists(Branch branch 
Int32 month 
Int32 year) in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling.Actions\Generators\WorkingJournalsDataGenerator.cs:line 412 
    at Danel.Nursing.Scheduling.Actions.Generators.WorkingJournalsDataGenerator.Generate(Branch branch 
Int32 month 
Int32 year) in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling.Actions\Generators\WorkingJournalsDataGenerator.cs:line 108 
    at Danel.Nursing.Scheduling.Controllers.WorkingJournalsController.<>c__DisplayClass37.<ShowWorkingJournalsData>b__32() in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling\Controllers\WorkingJournalsController.cs:line 826 
    at Danel.Nursing.Scheduling.Viewlets.WaitForAction.Worker_DoWork(Object sender 
DoWorkEventArgs e) in D:\Work\DanelNursing\branches\AugustVersion\Scheduling\Danel.Nursing.Scheduling\Viewlets\WaitForAction.cs:line 40 

それはそうです:
は、ここで私は取得しています例外です。
ここに何か不足していますか、それとも実装されていませんか? EDIT:
私は間違っていて、processedWorkRosters.Any()は評価できないようです。
外部アレイと比べてどうすればいいですか?

+0

GetNonCanceledAbsencesCriteria()をローカル変数に格納してから、LINQクエリでその変数を使用してみてください。 –

+0

@degorollsそれを試してみました。同じ結果。その他の提案はありますか? –

答えて

3

メソッドGetNonCanceledAbsencesCriteria()は、NHプロバイダから送信されるIQueryableを返します。これは、あなたが実行する操作が、SQLに変換される可能性が高いことを意味します。

from absence in GetNonCanceledAbsencesCriteria() 
where processedWorkRosters.Any(...) 
select absence 

上記の問題はprocessedWorkRostersは、それがSQL話すにそれらを変換する方法を知っていないことを意味NHのLINQプロバイダに変数外国であるということです。

試してみてください。

from absence in GetNonCanceledAbsencesCriteria().ToArray() 
where processedWorkRosters.Any(...) 
select absence 

ToArray()はすぐに評価されるようにGetNonCanceledAbsencesCriteria()を強制しますが、次善の(またはしない)とすることができる...とされている場合は、再書き込みwhere句に「閉じる必要があり - 「SQLは話す。

+0

この場合、これは非常に最適ではありません。 –

+0

私はこれに満足していませんが、これが正解であるので、私はこれを受け入れています。 –

関連する問題