| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > nhibernate отображать данные в виде некой сушности |
| Автор: KuMa1104 5.6.2012, 19:36 | ||||
Здравствуйте SQL запрос возврашает таблицу с данными. Я хочу чтобы эти данные отображались в виде некой сушности TestSelect, нужно как то указать ему что нужно использовать ее (в БД НЕТ ТАКОЙ СУШНОСТИ она просто для удобства), как это сделать?
|
| Автор: erm0l0v 6.6.2012, 08:16 | ||||
| Вы можете воспользоваться какой нибудь ORM например LinqToSQL или EntityFramework тогда все сущности будут сгенерированны автоматически. Так же вы можете получить результат запроса в виде DataTable и потом преобразовать в коллекцию сущностей. Если не хотите подключать тяжелую ORM или возиться с DataTable можно попробовать такой вариант:
здесь результат запроса жестко преобразуется в коллекцию определенных сущностей. Но вы можете заделать и более универсальную функцию используя dynamic или передавать в функцию тип коллекции и проинициализировать её с помощью рефлекшна. Добавлено через 13 минут и 22 секунды Сори, не увидел сразу в названии вашей темы nhibernate))) Неужели там нет такой функциональности в LinqToSQL и EntityFramework это есть. Например в LinqToSQL это будет выглядеть так:
LinqToSQL с помощью рефлекшна преобразует результат запроса в коллекцию типа T, возможно в nhibernate есть что то подобное... |
| Автор: KuMa1104 6.6.2012, 15:14 | ||
Да есть query.List<System.Object[]>() или query.UniqueResult<System.Object[]>(); проблемма в том что если вместо System.Object[] я подставлю свои TestSelect. NHibernate викинет исключение
Unable to cast object of type 'System.Object[]' to type 'Domain.TestSelect'. C ЗАМАПАННОЙ сушностью это работает. Но здесь попрасту не на что мапать, в БД нет таблицы соответствуюшей сушности TestSelect она созданна просто для удобства работы с данными которые возврашает запрос. |
| Автор: erm0l0v 6.6.2012, 15:36 |
| Вы можете сделать представление TestSelect, если NHibernate умеет с ними работать. Попробуйте в запросе с помощью as задать имена возвращаемых строк, по идеи они должны быть QuestionGroupDescription и IsActive но мало ли, может SQL назвал их как то по своему. А query.List<System.Object[]>() возвращает лист из массивов объектов, то есть каждый элемент листа это коллекция полей перечисленных в select? Просто странно что он пытается привести массив объектов к одному объекту. |
| Автор: KuMa1104 6.6.2012, 15:47 |
| Нашел вот такая штука. 17.1.5. Returning non-managed entities It is possible to apply an IResultTransformer to native sql queries. Allowing it to e.g. return non-managed entities. sess.CreateSQLQuery("SELECT NAME, BIRTHDATE FROM CATS") .SetResultTransformer(Transformers.AliasToBean(typeof(CatDTO))) This query specified: the SQL query string a result transformer The above query will return a list of CatDTO which has been instantiated and injected the values of NAME and BIRTHNAME into its corresponding properties or fields. IMPORTANT: The custom IResultTransformer should override Equals and GetHashCode, otherwise the query translation won't be cached. This also will result in memory leak. Добавлено через 1 минуту и 12 секунд erm0l0v спасибо за советы. |