2009-03-25 4 views
0

Я пытаюсь получить конкретный набор данных, объединив 4 разных сущности для этого. Что я сделал это настроить DTO, чтобы попытаться получить эту работу:Как мне получить типизированную коллекцию, которая запрашивает несколько объектов с помощью ActiveRecord от Castle?

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; } 
    } 
} 

Теперь я думал, что я мог бы использовать SimpleQuery так:

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 (0, 10, HQL);

Мой метод хранилища выглядит следующим образом:

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(); 
    } 

Теперь она просит меня поставить [ActiveRecord] в верхней части моего LatestThread класса. Когда я делаю это, ему нужен первичный ключ, и это просто неправильный путь.

Я также прочитал биты, которые относятся к атрибуту Import, присвоенному классам, которые не являются DTO. Во всех примерах, хотя это всего лишь два сущности, которые соединяются, а не 4, которые у меня есть. Нужно ли добавлять импорт во все 4? Или есть что сказать AR, что это класс только для чтения? ИЛИ я делаю все это неправильно, и есть очень простой способ сделать то, что я пытаюсь сделать.

TIA!

+0

Думая, что я хочу сделать, это не это просто. Похоже, если вы хотите жаждущих пунктов нагрузки вы должны выбрать все столбцы, которые своего рода удары ... от столба р \t \t присоединиться выборки p.Comments \t \t присоединиться выборки p.Blog \t где p.Id = 1 – rball

+0

http://trappedinaworldofcode.wordpress.com/2008/03/19/strongly-typed-results-from-nhibernate-hql-projection-query/ – rball

ответ

2

Добавьте атрибут импорта в свой новый класс Thread

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

А потом, магия запрос бывает :)

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() 

Источник: http://www.kenegozi.com/Blog/2006/10/08/projection-using-activerecords-importattribute-and-hqls-select-new-clause.aspx

+0

Спасибо, я попробую! – rball

+0

Я действительно видел это сообщение раньше, но не был уверен, где стоит поставить импорт. Кажется, вам просто нужно положить его на одно из сущностей? Тогда вернемся к моему LastThread. Мне не нужны никакие атрибуты?Похоже, из вашего примера, что я был близок, но мой exe ошибся в конце – rball

+0

Нет списка () method off query ... – rball

1

Вы не можете запросить тип, который не отображается (это то, что делает атрибут [ActiveRecord]). AFAIK вы не можете заставить NHibernate создать новый экземпляр произвольного объекта, подобный этому через HQL (я могу исправить, если кто-то знает иначе).

Лучше всего сделать запрос на проекцию, а затем применить метод сопоставления кортежей, возвращаемых в экземпляры вашего типа.

Мой ответ here показывает, как выполнить проекционный запрос и сопоставить его с анонимным типом; то, что вы хотите сделать, мало чем отличается. Затем вы можете поместить метод в это в репозиторий типа или строго типизированный метод расширения в общий репозиторий.

+0

Crap, действительно новый для nhib и арка замка. Я начинаю понимать «проекции», но кортежи? : P Я проверю это. – rball