Можно ли разрешить запрашиваемым объектам влиять на запрос, который выбирает их с помощью Linq и NHibernate? - PullRequest
0 голосов
/ 10 января 2012

У меня есть набор объектов подклассов доменов, которые я получаю с помощью Linq и NHibernate. Вот пример того, что у меня есть:

public abstract class Car {
    public abstract bool Runs();
}

public class Junker : Car { 
    public override bool Runs() {
        return false;
    }
}

public class NewCar : Car { 
    public override bool Runs() {
        return true;
    }
}

Мне нужно выбрать только те автомобили, которые Run(). Итак, я хочу сделать это:

var goodCars = _session.Query<Car>().Where(car => car.Runs());

... но это не работает, потому что Runs() не является поддерживаемым источником запросов. Вот ошибка, которую я получаю:

Cannot parse expression 'car' as it has an unsupported type. Only query sources (that is, expressions that implement IEnumerable) and query operators can be parsed.

Я пытался разделить запрос на два шага: 1) получить все машины, 2) отфильтровать по Runs() ... но я не могу сделать это, потому что это нарушает Lazy Loading (моя модель домена немного более Сложный, что мой автомобиль пример). Кроме того, я хочу получить только те элементы из базы данных, которые действительно соответствуют моему запросу.

Есть ли способ сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

2 голосов
/ 10 января 2012

Вы не можете сделать это. То, что вы пытаетесь сделать, невозможно перевести в SQL-запрос, и, в конечном итоге, NHibernate делает все ... нет.

Чтобы получить все с помощью одного запроса, вам потребуется перейти на уровень базы данных и использовать некоторые знания, не относящиеся к предметной области. Я рекомендую скрыть это за интерфейсом сервиса.

открытый интерфейс RunningCars { IEnumerable All (); }

и его реализация может быть с использованием пользовательского SQL-запроса или хранимой процедуры.

Как сделать это за 2 шага, чтобы прервать ленивую загрузку? Возможно, вам нужно указать, что вы хотите предварительно извлечь эти ассоциации во время первоначального запроса.

Также в этом конкретном примере не могли бы вы просто получить все экземпляры NewCar?

0 голосов
/ 10 января 2012

если вы преобразуете Runs в свойство только для чтения

public virtual bool Runs {get; private set;}

Вы можете отобразить его в своем HBM и запросить свойство run. Но поскольку это не ваша настоящая модель, на самом деле нет другого способа помочь вам, кроме как сказать

  1. сменить модель
  2. вы не можете запрашивать методы объекта
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...