Вопрос по linq, notsupportedexception, nhibernate – NHibernate Преодоление NotSupportedException

6

Кто-нибудь знает какой-либо способ преодоления NotSupportedException? У меня есть метод против пользователя:

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

И я хочу сделать:

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

Но это создает исключение NotSupportedException. Настоящая боль, хотя это то, что с помощью

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

работает абсолютно нормально. Однако мне не нравится это решение, потому что это означает, что если я изменю работу метода IsAbove, мне придется помнить все места, где я продублировал код всякий раз, когда я хочу его обновить.

кстати, & quot; чIE rarchy & Quot; :) AakashM
дерьмо, я всегда первый, кто указывает, когда люди тоже не могут писать по буквам! Должно быть, он ошибался в течение многих лет: $ Jordan Wallwork

Ваш Ответ

1   ответ
3

Назовите выражение спецификации и используйте его повторно, например:

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

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

При необходимости повторно используйте IsAboveSpecification в запросе. Если часто используется метод IsAbove (), use может кэшировать результат метода Compile () в выражении.

У меня та же проблема, что и у OP. Не могу заставить это решение работать. Во-первых, я хочу иметь возможность вызывать объект, поэтому мне пришлось перенести инициализацию в конструктор, потому чтоthis не был доступен в инициализаторе члена. Хуже того, я получаю сообщение об ошибке при попытке вызвать выражение спецификации: «Ожидается метод, делегат или событие». Какие-либо предложения?
Попытка вызова .Compile (). Invoke () для выражения. Он компилируется сейчас, но получает то же исключение при вызове функции & quot; IsAbove & quot; из запроса.
Вам следует задать новый вопрос и опубликовать код, который вы пытаетесь использовать. Я не думаю, что NH будет жаловаться на что-то публичное - он настаивает на том, чтобыvirtual Модификатор присутствует, хотя.
Невозможно вызвать выражение из запроса по нескольким причинам: во-первых, когда оно помечено как общедоступное, NH жалуется, что поля должны быть защищены или закрыты. Во-вторых, когда я попытался вызвать его из внешнего запроса, я получил тот же «Метод, делегат или ожидаемое событие». ошибка компилятора, как указано выше.
Спасибо за предложение. Вроде как, на данный момент, но я уверен, что мы вернемся к этому. Я задам новый вопрос, когда это снова станет актуальным (так будет!).

Похожие вопросы