2012-06-18 9 views
6

Qualcuno sa come superare NotSupportedException? Ho un metodo contro un utente:Superamento NHibern NotSupportedException

public virtual bool IsAbove(User otherUser) 
{ 
    return HeirarchyString.StartsWith(otherUser.HeirarchyString); 
} 

E io voglio fare:

_session.Query<User>.Where(x => loggedInUser.IsAbove(x)); 

Ma questo getta una NotSupportedException. Il vero dolore è che utilizzando

_session.Query<User>.Where(x => loggedInUser.HeirarchyString.StartsWith(x.HeirarchyString)); 

funziona assolutamente bene. Non mi piace come soluzione, tuttavia, perché significa che se cambio il modo in cui funziona il metodo IsAbove, devo ricordare tutti i punti in cui ho duplicato il codice ogni volta che voglio aggiornarlo.

+1

btw, "h ** IE ** rarchy" :) – AakashM

+0

ah merda, sono sempre il primo a sottolineare quando le persone non possono scrivere anche! Devo averlo sbagliato per anni: $ –

risposta

3

Nome specifica espressione e riutilizzo che, ad esempio:

public Expression<Func<....>> IsAboveSpecification = (...) => ...; 

public virtual bool IsAbove(User otherUser) 
{ 
    return IsAboveSpecification(HeirarchyString, otherUser.HeirarchyString); 
} 

Riutilizzare IsAboveSpecification nella query secondo necessità. Se il metodo IsAbove() viene utilizzato spesso, può memorizzare nella cache il risultato del metodo Compile() nell'espressione.

+0

Sto avendo lo stesso problema di OP. Non riesco a far funzionare questa soluzione. In primo luogo, voglio essere in grado di chiamare l'oggetto, quindi ho dovuto spostare l'inizializzazione nel costruttore perché "questo" non era disponibile in un inizializzatore membro. Peggio ancora, sto ricevendo un errore quando provo a chiamare l'espressione della specifica: "Metodo, delegato o evento previsto". Eventuali suggerimenti? –

+0

Provato a chiamare .Compile(). Invoke() sull'espressione. Si compila ora, ma ottiene la stessa eccezione quando chiama la funzione "IsAbove" da una query. –

+0

Impossibile chiamare l'espressione dalla query per diversi motivi: innanzitutto, quando è contrassegnato come pubblico, NH si lamenta che i campi devono essere protetti o privati. In secondo luogo, quando ho provato a chiamarlo da una query esterna ho ottenuto lo stesso errore del compilatore "Metodo, delegato o evento previsto" come sopra. –

Problemi correlati