Nhibernate Projection Query DTO, используйте метод вместо свойства - PullRequest
0 голосов
/ 04 августа 2010

Это работает:

    projections.Add(Projections.Property(Member<MailOrder>.From(x => x.AssigneeCode).QualifiedPath), Member<MailOrderItem>.From(x => x.AssigneeCode).Path);
    projections.Add(Projections.Property(Member<MailOrder>.From(x => x.AssigneeName).QualifiedPath), Member<MailOrderItem>.From(x => x.AssigneeName).Path);
    projections.Add(Projections.Property(Member<MailOrder>.From(x => x.AssigneeType).QualifiedPath), Member<MailOrderItem>.From(x => x.AssigneeType).Path);            

Это не естественно

projections.Add(Projections.Property(Member<IMailOrderAssignee>.From(x => x.AssigneeCode).QualifiedPath), Member<MailOrderItem>.From(x => x.Code).Path);
projections.Add(Projections.Property(Member<IMailOrderAssignee>.From(x => x.AssigneeName).QualifiedPath), Member<MailOrderItem>.From(x => x.GetName()).Path);
projections.Add(Projections.Property(Member<IMailOrderAssignee>.From(x => x.AssigneeType).QualifiedPath), Member<MailOrderItem>.From(x => x.GetType()).Path);            

Это не работает из-за двух вещей:

  1. нет интерфейса для интерфейса
  2. Методы используются в свойствах.

Я много искал в мире Ниберанте, но мне кажется, что это довольно сложно.

IMailOrderAssignee - это интерфейс для двух рутинеров (назовем их RootX и RootY). В контексте моих MailOrders не важно, какой это корень, если у меня есть ссылка на него + имя, его код и адреса электронной почты.

IMailOrderAssignee сопоставляется с тегом any - в файле сопоставления. (это прекрасно работает, но я мог бы сделать это и с дискриминатором).

Мой вопрос:

  1. Можно ли использовать результат метода в запросе проекции так результат в DTO?

  2. Возможно ли использование контрактов в проекционных запросах (наверное нет ...)

1 Ответ

1 голос
/ 05 августа 2010

Почему бы не сделать проекцию в памяти?

Пример:

var criteria = someCriteriaThatReturnsPersistentEntities;
var items = criteria.List<IMailOrderAssignee>();
var projected = items.Select(i => new
                                  {
                                      Prop1 = i.SomeMethod(),
                                      Etc
                                  });
...