Wie bekomme ich wieder eine stark typisierte Sammlung, die mehrere Einheiten mit Castle Active fragt?

StackOverflow https://stackoverflow.com/questions/680386

Frage

Ich versuche, eine bestimmte Menge von Daten zu erhalten, während Beitritt 4 verschiedene Einheiten zusammen zu tun. Was ich getan habe, ist die Installation eines DTO zu versuchen, diese Funktion zu erhalten:

public class LatestThread
{
    private readonly string comment;
    private readonly DateTime posted;
    private readonly string userName;
    private readonly int reputation;
    private readonly int threadId;
    private readonly string topic;
    private readonly int userId;
    private readonly string avatar;

    public LatestThread(string comment, DateTime posted, string userName, int reputation, int threadId, string topic, int userId, string avatar)
    {
        this.comment = comment;
        this.avatar = avatar;
        this.userId = userId;
        this.topic = topic;
        this.threadId = threadId;
        this.reputation = reputation;
        this.userName = userName;
        this.posted = posted;
    }

    public string Comment
    {
        get { return comment; }
    }

    public DateTime Posted
    {
        get { return posted; }
    }

    public string UserName
    {
        get { return userName; }
    }

    public int Reputation
    {
        get { return reputation; }
    }

    public int ThreadId
    {
        get { return threadId; }
    }

    public string Topic
    {
        get { return topic; }
    }

    public int UserId
    {
        get { return userId; }
    }

    public string Avatar
    {
        get { return avatar; }
    }
}

Jetzt dachte ich, ich SimpleQuery verwenden könnte etwa so:

string hql = string.Format("select new LatestThread(m.Comment, m.Posted, u.UserName, u.Reputation, t.Id, t.Topic, u.Id, u.Avatar) from Thread as t inner join Message as m on t.Id = m.ThreadId inner join User as u on u.Id = m.PostedById inner join Activity as a on a.Id = t.ActivityId where a.Lineage like '{0}%' order by t.LastPosted desc", activityLineage);

repository.SimpleQuery return (0, 10, HQL);

Meine Repository-Methode wie folgt aussieht:

    public virtual IList<T> SimpleQuery<T>(int firstResult, int maxResults, string hql, params object[] parameters)
    {
        var query = new SimpleQuery<T>(hql, parameters);
        query.SetQueryRange(firstResult, maxResults);
        return query.Execute();
    }

Jetzt für mich bittet zu setzen [Active] an der Spitze meiner LatestThread Klasse. Wenn ich, dass es einen Primärschlüssel will, und das scheint nur der falsche Weg zu sein.

Ich habe auch Bits gelesen, den Klassen gegeben zum Import Attribute beziehen, die nicht die DTO sind. In allen Beispielen, obwohl es nur zwei Einheiten, nicht die 4 verbunden sind ich habe. Muss ich Import für alle 4 hinzufügen? Oder gibt es etwas AR zu sagen, dass es sich um eine Nur-Lese-DTO-Klasse ist? Oder bin ich das alles falsch zu machen und es gibt eine wirklich einfache Art und Weise zu tun, was ich versuche zu tun.

TIA!

War es hilfreich?

Lösung

Fügen Sie das Import-Attribut zu Ihrer neuen Thread-Klasse

[Import(typeof(LatestThread), "LatestThread")]
[ActiveRecord("Thread")]
public class Thread : ActiveRecordBase<Thread> { /* blah blah */ }

Und dann Abfrage Magie passiert:)

string hql = string.Format("select new LatestThread(m.Comment, m.Posted, u.UserName, u.Reputation, t.Id, t.Topic, u.Id, u.Avatar) from Thread as t inner join Message as m on t.Id = m.ThreadId inner join User as u on u.Id = m.PostedById inner join Activity as a on a.Id = t.ActivityId where a.Lineage like '{0}%' order by t.LastPosted desc", activityLineage);

SimpleQuery<LatestThread> query = new  SimpleQuery<LatestThread>(typeof(Thread), hql );  
LatestThread[] results = query.Execute()

Quelle: http://www.kenegozi.com/Blog/2006/10/08/projection-using-activerecords-importattribute-and-hqls-select-new-clause.aspx

Andere Tipps

Sie können einen Typ abfragen, die nicht abgebildet ist (das ist, was das [ActiveRecord] Attribut der Fall ist). AFAIK kann man nicht NHibernate bekommt eine neue beliebige Objektinstanz wie das über HQL zu erstellen (Ich stehe korrigiert werden, wenn jemand weiß etwas anderes).

Ihre beste Wette ist eine Projektion Abfrage zu tun und haben dann eine Methode die Tupel zurückgegeben in Instanzen des Typs abzubilden.

Meine Antwort hier zeigt, wie eine Projektions Abfrage zu tun und wo es zu einem anonymen Typ; was Sie tun wollen, ist nicht viel anders. Sie könnten dann ein Verfahren setzen diese in einem typspezifischen Repository zu tun oder zu einer stark typisierte Erweiterungsmethode mit dem generischen Repository.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top