2015-02-06 13 views
7

Ho un po 'di codice con la query LINQ che utilizza nHibernate e quando viene eseguito genera una PartialEvaluationExceptionExpression. Cosa significa esattamente questo, e cosa posso fare al riguardo?Cos'è una PartialEvaluationExceptionExpression e come posso risolverlo?

SomeIqueryableNhibernateObject 
.Where(x=>... 
some expression 
&& !Model.date.HasValue ? true : (x.fooDate.Date == Model.date.Value.Date) 
&& some expresion 

Dove modello è:

public class Filter 
{ 
    DateTime? date; 
} 

Eccezione è causato dalla falsa percorso del l'operatore ternario:

x.fooDate.Date == Model.date.Value.Date 

Anche se modificarlo per:

x.fooDate != null && Model.date.HasValue && x.fooDate.Date == Model.date.Value.Date 

ancora lancia l'eccezione.

+0

Hai cercato la documentazione di 'PartialEvaluationExceptionExpression' per vedere cosa dice su cosa significhi quell'eccezione? – Servy

+0

Sono rimasto sorpreso, ma non sono riuscito a trovare alcuna informazione chiara su quell'eccezione. Ad esempio questo: http://www.nudoq.org/#!/Packages/NHibernate/NHibernate/PartialEvaluationExceptionExpression - a mio parere non fornisce alcuna informazione utile. – Landeeyo

+0

Il primo risultato di Google per me era questo: http://www.nudoq.org/#!/Packages/Remotion.Linq/Remotion.Linq/PartialEvaluationExceptionExpression – Servy

risposta

7

Si sta eseguendo il codice che sta ottenendo il valore di un oggetto null e quindi il suo lancio. Quando il provider di query tenta di tradurre quella query in qualcosa che il database può eseguire, deve risolvere Model.date.Value.Date nel suo valore, in modo che il valore possa essere utilizzato nella query. Poiché non vi è alcun valore, il codice si interrompe.

La soluzione, naturalmente, è quella di non integrare un controllo come questo nella query stessa. Determinare, al di fuori del contesto della query, anche se non si dovrebbe essere l'aggiunta di questo controllo, e quindi aggiungere solo se necessario:

var query = CreateInitialQuery(); 
if(Model.date.HasValue) 
    query = query.Where(x => x.fooDate.Date == Model.date.Value.Date); 

Qui il fornitore di query è sempre e solo dato un valore da non valutare quando in realtà è un valore da valutare.

+1

La cosa più importante per me che hai scritto è la parte sulla traduzione Espressione LINQ in SQL. Stavo pensando troppo "imperativo" quindi sono rimasto sorpreso del motivo per cui il falso percorso viene eseguito se la condizione è vera. Ad essere onesti, ho già risolto il problema nello stesso modo, estraendolo come hai scritto ma non sapevo ancora perché non funziona. Ora capisco la causa. Grazie mille. – Landeeyo

Problemi correlati