2009-12-29 5 views
0

Я пытаюсь преобразовать следующий запрос NHibernate, используя dyanmic-экземпляр в IList < t>, а не IList.Передача IList IList <t> с использованием динамического экземпляра

IList<AllName> allNames = 
    (IList<AllName>)Session.CreateQuery(
    @"select new AllName(
    name.NameId, name.FirstName, origin.OriginId, origin.Description, 
    name.Sex, name.Description, name.SoundEx 
) from Name name join name.Origin origin") 
    .SetFirstResult(skip) 
    .SetMaxResults(pageSize); 

Запуск этого я получаю следующее сообщение об ошибке: -

Unable to cast object of type 'NHibernate.Impl.QueryImpl' to type 'System.Collections.Generic.IList`1[Domain.Model.Entities.AllName]'.

Я знаю, что я могу вернуться

IList results = Sesssion.CreateQuery(... 

но мои слои услуг ожидают

IList<AllName> 

Как могу ли я достичь этого?

ответ

5

Один из вариантов заключается в том, чтобы написать реализацию IList<T>, которая проксирует до IList, отливая при необходимости. Это не должно быть слишком сложно сделать, хотя и несколько утомительно. LINQ сделает это немного проще с точки зрения реализации IEnumerable<T> и т. Д. - вы можете просто вызвать базовый итератор и вызвать на нем, например, Cast<T>().

Другим решением было бы создать новый List<T> из возвращенного списка:

IList query = Session.CreateQuery(...); 
IList<AllName> allNames = new List<AllName>(query.Cast<AllName>()); 

EDIT: Как Sander так справедливо указывает, что это то, что ToList для:

IList query = Session.CreateQuery(...); 
return query.Cast<AllName>().ToList(); 

EDIT: Все это было NHibernate-агностиком, как бы - я действительно мало что знаю о NHibernate. Теперь Rippo нашел гораздо более простой ответ: вместо этого вызывается List<AllName> (это метод NHibernate).

+3

Когда вы используете метод расширения .Cast (), вы можете просто добавить '.ToList()'. –

+1

Спасибо, Джон, бросок работал. Есть ли здесь какая-то производительность? Размер моей страницы установлен на 50 записей, поэтому я не возвращаю огромное количество данных. – Rippo

+0

@sander: doh! Почему нет. Я думаю об этом? :) –

 Смежные вопросы

  • Нет связанных вопросов^_^