Гость
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate и запрос по свойству подкласса / 5 сообщений из 5, страница 1 из 1
15.06.2011, 19:31
    #37309871
barser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate и запрос по свойству подкласса
Пусть у нас есть 3 класса:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Car { }

public class RacingCar : Car { 
  int MaxNitroTime {get; set;}
}

public class FastCarOwner { 
  Car Car { get; set; }
}

Напишем запрос:

Код: plaintext
1.
2.
3.
4.
CreateCriteria(typeof(Owner))
  .CreateAlias("Car", "x")
  .Add(Restrictions.Eq("x.MaxNitroTime", 300))
  .List<Owner>();

Все замечательно работает.... Пока у всех FastCarOwner'ов машины класса RacingCar...
А вот как бы добавить проверку типа Car в запросе (или лучше приведение типа)?

То что свойство Car в классе Owner имеет тип Car, а не RacingCar - это ошибка проектирования с точки зрения персистентных POCO-классов или вполне допустимый вариант?


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

Всем спасибо за внимание!
...
Рейтинг: 0 / 0
16.06.2011, 11:29
    #37310577
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate и запрос по свойству подкласса
Criteria строится по вашему маппингу (по какой-то структуре в БД), задайте себе вопрос, "какой надо сгенерировать sql query ?"
и дальше создавайте критерию с нужными алиасами чтоб получить этот запрос.

например если у вас такая же стурктура таблиц как и классы:

Car:Id<-RacingCar:Id(FK_Car)
Car:Id<-FamilyCar:Id(FK_Car)
Owner:CarId

то вам просто надо джоин (алиас) делать по интересующей вам таблице RacingCar и у вас навернека будут только владельцы с этим типом машин
...
Рейтинг: 0 / 0
16.06.2011, 13:51
    #37310981
barser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate и запрос по свойству подкласса
stimpi,
спасибо за ответ, но я не до конца понял. :)
Вы пишете:
авторвам просто надо джоин (алиас) делать по интересующей вам таблице RacingCar и у вас навернека будут только владельцы с этим типом машин


Однако такой алиас я написать не могу, так как у свойства Car в классе Owner стоит тип Car, а не RacingCar.
Или могу? Каким образом можно в CreateAlias указать интересующую таблицу??

Так не заработает:
Код: plaintext
1.
2.
3.
4.
CreateCriteria(typeof(Owner))
  .CreateAlias("RacingCar", "x") // <----
  .Add(Restrictions.Eq("x.MaxNitroTime", 300))
  .List<Owner>();
...
Рейтинг: 0 / 0
16.06.2011, 16:17
    #37311425
stimpi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate и запрос по свойству подкласса
вот так, но в маппинге RacingCar это subclass от Car
Код: plaintext
1.
2.
var criteria = CreateCriteria(typeof(Car))
var racingCarCriteria = criteria.AddCriteria<RacingCar>(car => car.Id, "RacingCarAlias");
         racingCarCriteria.And.Add(rc => rc.MaxNitroTime == 300);
...
Рейтинг: 0 / 0
16.06.2011, 21:44
    #37311876
barser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
NHibernate и запрос по свойству подкласса
stimpi,

большое спасибо! интересный вариант, завтра на работе попробую.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / NHibernate и запрос по свойству подкласса / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]