NHibernate Overcoming NotSupportedException

2019-04-07 22:40发布

问题:

Does anyone know of any way to overcome NotSupportedException? I have a method against a User:

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

And I want to do:

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

But this throws a NotSupportedException. The real pain though is that using

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

works absolutely fine. I don't like this as a solution, however, because it means that if I change how the IsAbove method works, I have to remember all the places where I have duplicated the code whenever I want to update it

回答1:

Name the specification expression and reuse that, e.g:

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

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

Reuse IsAboveSpecification in the query as needed. If the IsAbove() method is used often use can cache the result of the Compile() method on the expression.