Intereting Posts
Добавление строки в стенографический литерал verbatim Тип одного из значений первичного ключа не соответствовал типу, определенному в объекте. См. Внутреннее исключение для подробностей Возвращать datareader из метода SignalR – трансляция через концентратор в другом проекте извне концентратора Каков наилучший способ для .NET winforms приложения обновить себя, не используя ClickOnce? Как создать массив в vb.net с помощью инициализаторов объектов для установки свойств Как перенести основную форму вверх при попытке запустить второй экземпляр приложения C #: нарисуйте один битмап на другой, с прозрачностью Использовать массив для заполнения списка? Как извлечь подстроку из .NET RegEx? Поиск плавающих точек в большой строке GetElementById () не находит тег? C # перейти к следующему элементу в списке, основанном на инструкции if в foreach C #: асинхронные delegates против ThreadPool.QueueUserWorkItem при запуске многих соединений Как сравнить временную часть даты и времени

Запрос дискриминатором в NHibernate

Я немного поработал над этим и ничего не понял. Возможно ли создать запрос Hibernate для возврата набора объектов на основе дискриминатора?

У меня есть class AbstractUser, который расширен конкретными classами UserTypeA и UserTypeB. Я использую модель table-per-hierarchy для сопоставления своих classов в NHibernate, поэтому UserTypeA и UserTypeB хранятся в одной таблице с разными значениями дискриминатора. Вот мое свойство отображения дискриминатора:

 

У меня есть столбец в моей таблице, который содержит имя типа пользователя. Мне интересно, можно ли запустить NHibernate-запрос, используя это.

Я попробовал это:

 public IList FindByType(string typeName, Type type) { string query = "from " + type.Name + " k where k.Type = " + typeName; return Session.CreateQuery(query).List(); } 

Но так как Type на самом деле не является свойством classа, просто столбец в таблице, это, очевидно, не работает. Казалось бы излишним иметь как свойство для этой цели, так и дискриминатор, если только не существует способа использовать свойство в качестве дискриминатора?

Фактически, это хорошо документировано по адресу http://www.nhibernate.info/doc/nh/en/index.html#queryhql-where :

Аналогично, class специальных свойств обращается к значению дискриминатора экземпляра в случае полиморфного сохранения. Имя classа .Net, встроенное в предложение where, будет переведено на его значение дискриминатора.

  from Eg.Cat cat where cat.class = Eg.DomesticCat 

Вы также можете передать экземпляр System.Type в качестве параметра.

Если вы действительно хотите запросить тип, я думаю, что использование ICriteria API – более удобный вариант:

 public IList FindByType() { return Session.CreateCriteria(typeof(T)).List(); } 

Теперь вы можете использовать его как IList list = FindByType() .