2012-06-18 11 views
6

¿Alguien sabe de alguna manera para superar NotSupportedException? Tengo un método en contra de un usuario:NHibernate Superando NotSupportedException

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

Y lo que quiero hacer:

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

Pero esto arroja una NotSupportedException. El verdadero dolor es que usando

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

funciona absolutamente bien. No me gusta esto como una solución, sin embargo, porque significa que si cambio cómo funciona el método IsAbove, tengo que recordar todos los lugares donde he duplicado el código cada vez que quiero actualizarlo

+1

por cierto, "h ** IE ** rarchy" :) – AakashM

+0

¡Ah, mierda, siempre soy el primero en señalar cuando las personas no pueden deletrear también! debe haber estado equivocado durante años: $ –

Respuesta

3

Nombre el expresión especificación y reutilizar que, por ejemplo:

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

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

reutilización IsAboveSpecification en la consulta según sea necesario. Si el método IsAbove() se usa a menudo, use puede almacenar en caché el resultado del método Compile() en la expresión.

+0

Estoy teniendo el mismo problema que OP. No puedo hacer que esta solución funcione. En primer lugar, quiero poder invocar el objeto, así que tuve que mover la inicialización al constructor porque 'this' no estaba disponible en un inicializador miembro. Peor aún, obtengo un error al intentar llamar a la expresión de especificación: "Método, delegado o evento esperado". ¿Alguna sugerencia? –

+0

Intentó llamar a .Compile(). Invocar() en la expresión. Se compila ahora, pero recibe la misma excepción cuando llama a la función "IsAbove" desde una consulta. –

+0

No se puede llamar a la expresión de la consulta por varias razones: primero, cuando se marca como pública, NH se queja de que los campos deben estar protegidos o privados. En segundo lugar, cuando intenté llamarlo desde una consulta externa obtuve el mismo error de compilación "Método, delegar o evento esperado" que el anterior. –

Cuestiones relacionadas