Я недавно создал метод для применения выбора различного на основе типа сопоставленного объекта.
Это применяет это к объекту IQueryOver (свойство класса). Метод также имеет доступ к конфигурации nhibernate. Вы можете добавить их в качестве параметров метода. Нужно работать для производства, но метод отлично работает в dev, пока что использовал его только для одного объекта.
Этот метод был создан, потому что я пытаюсь выстроить свои данные на уровне сервера и преобразователь результатов не будет работать.
После того как вы получите коллекцию объектов (query.List ()), вам может потребоваться перезагрузить объекты, чтобы заполнить один или несколько дочерних объектов. Отображения "многие к одному" будут передаваться для ленивых нагрузок.
public void DistinctRootProjectionList<E>()
{
var classMapping = Context.Config.GetClassMapping(typeof(E));
var propertyIterator = classMapping.UnjoinedPropertyIterator;
List<IProjection> projections = new List<IProjection>();
ProjectionList list = Projections.ProjectionList();
list.Add(Projections.Property(classMapping.IdentifierProperty.Name), classMapping.IdentifierProperty.Name);
foreach (var item in propertyIterator)
{
if (item.Value.IsSimpleValue || item.Value.Type.IsEntityType)
{
list.Add(Projections.Property(item.Name), item.Name);
}
}
query.UnderlyingCriteria.SetProjection(Projections.Distinct(list));
query.TransformUsing(Transformers.AliasToBean<E>());
}
Код, который я использовал для загрузки отношений один ко многим ... T - тип сущности.
for (int i = 0; i < resp.Data.Count; i++)
{
resp.Data[i] = session.Load<T>(GetInstanceIdValue(resp.Data[i]));
}