2017-10-11 4 views
1

Ich habe eine DTo-Klasse UserDTO mit dem folgenden Konstruktor public UserDTO(User user). Ich habe auch eine NHibernate-Abfrage erstellt, die eine IList<TodoDTO> abruft, wobei jede TodoDTO die folgende Eigenschaft public IList<UserDTO> ResponsibleUsers { get; set; } hat. Ich frage mich, ob es zu diesem Konstruktor auf UserDTO in meiner Anfrage möglich wäre, so etwas wie diese:Aufrufen eines Objektkonstruktors aus NHibernate QueryOver SelectList

var responsibleUsers = session.QueryOver<UserTodo>() 
    .JoinAlias(ut => ut.User,() => userAlias) 
    .Where(ut => ut.Todo.Id.IsIn(_todos.Select(t => t.Id).ToArray())) 
    .Select(u => new UserDTO(userAlias)).ToList<UserDTO>(); 

Der Konstruktor wie folgt aussieht:
public UserDTO(User user) {}

Das Problem ist, dass, wenn ich laufe Dieser Code der UserDTO Konstruktor der user ist null.

+0

Was passiert also, wenn Sie diesen Code ausführen? –

+0

Dies ist nicht Code, der tatsächlich ausgeführt wird, dieser Code soll nur ein Beispiel geben, was ich tun möchte. – Bunnynut

+0

@ChetanRanpariya Hinzugefügt einige mit zusätzlichen Details. – Bunnynut

Antwort

1

Das Aufrufen eines Konstruktors (oder eines anderen Codes) in der Syntax einer Abfrage funktioniert nicht. Die Entitäten hier werden nur zum Auflösen der Tabelle und der Spalten für die SQL-Abfrage verwendet. Die Fähigkeit, Methoden dieser Objekte zu nennen ist missleading ...

Sie eine Projektion verwenden können Daten von einem oder mehreren db-Einheiten auf ein neues Objekt zu wählen (in Ihrem Fall: Zum UserDTO)

UserTodo userTodo = null 
UserDTO result = null; 
var responsibleUsers = session.QueryOver<UserTodo>(() => userTodo) 
.JoinAlias(ut => ut.User,() => userAlias) 
.Where(ut => ut.Todo.Id.IsIn(_todos.Select(t => t.Id).ToArray())) 
.SelectList(list => list 
    .Select(() => userAlias.FirstName).WithAlias(() => result.FirstName) 
    .Select(() => userAlias.UserId).WithAlias(() => result.IdOfUser) 
    .Select(() => userTodo.Age).WithAlias(() => result.Age) // if you require any values from UserTodo 
) 
.TransformUsing(Transformers.AliasToBean<UserDTO >()) 
.List<UserDTO >(); 
Verwandte Themen