Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> nhibernate отображать данные в виде некой сушности 
:(
    Опции темы
KuMa1104
Дата 5.6.2012, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Здравствуйте SQL запрос возврашает таблицу с данными. Я хочу чтобы эти данные отображались в виде некой сушности TestSelect, нужно как то указать ему что нужно использовать ее (в БД НЕТ ТАКОЙ СУШНОСТИ она просто для удобства), как это сделать?
Код

public class TestSelect
    {
        public virtual string QuestionGroupDescription { get; set; }
        public virtual bool IsActive { get; set; }
    }
 

Код

ISQLQuery query = Session.CreateSQLQuery(
                "Select QuestionGroup.QuestionGroupDescription, QuestionGroup.IsActive From QuestionGroup ");

            IList<System.Object[]> results = query.List<System.Object[]>();





--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
erm0l0v
Дата 6.6.2012, 08:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



Вы можете воспользоваться какой нибудь ORM например LinqToSQL или EntityFramework тогда все сущности будут сгенерированны автоматически.

Так же вы можете получить результат запроса в виде DataTable и потом преобразовать в коллекцию сущностей.

Если не хотите подключать тяжелую ORM или возиться с DataTable можно попробовать такой вариант:
Код

public IEnumerable<Person> ReadInDateBase()
        {
            using (SqlCeConnection con = new SqlCeConnection(CONNECTION_STRING))
            {
                SqlCeCommand comm = new SqlCeCommand();
                comm.Connection = con;

                con.Open();

                comm.CommandText = @"SELECT ID, Name, LastName, Disctiption FROM Persons";
                SqlCeDataReader reader = comm.ExecuteReader();
                while (reader.Read())
                {
                    yield return new Person
                    {
                        ID = (int)reader[0],
                        Name = (string)reader[1],
                        LastName = (string)reader[2],
                        Disctiption = (string)reader[3],
                    };
                }
            }
        }


здесь результат запроса жестко преобразуется в коллекцию определенных сущностей. Но вы можете заделать и более универсальную функцию используя dynamic или передавать в функцию тип коллекции и проинициализировать её с помощью рефлекшна.

Добавлено через 13 минут и 22 секунды
Сори, не увидел сразу в названии вашей темы nhibernate)))

Неужели там нет такой функциональности в LinqToSQL и EntityFramework это есть.

Например в LinqToSQL это будет выглядеть так:

Код

DataContext.ExecuteQuery<T>("select ..");


LinqToSQL с помощью рефлекшна преобразует результат запроса в коллекцию типа T, возможно в nhibernate есть что то подобное...

Это сообщение отредактировал(а) erm0l0v - 6.6.2012, 08:20
PM MAIL   Вверх
KuMa1104
Дата 6.6.2012, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Цитата(erm0l0v @  6.6.2012,  08:16 Найти цитируемый пост)
DataContext.ExecuteQuery<T>("select ..");


Да есть query.List<System.Object[]>() или query.UniqueResult<System.Object[]>(); проблемма в том что если вместо System.Object[] я подставлю свои TestSelect. NHibernate викинет исключение

Код

 ISQLQuery query = Session.CreateSQLQuery(
                "Select QuestionGroup.QuestionGroupDescription, QuestionGroup.IsActive From QuestionGroup where QuestionGroup.QuestionGroupId = 1");

TestSelect t= query.UniqueResult<TestSelect>();


Unable to cast object of type 'System.Object[]' to type 'Domain.TestSelect'. 
C ЗАМАПАННОЙ сушностью это работает. Но здесь попрасту не на что мапать, в БД нет таблицы соответствуюшей сушности TestSelect она созданна просто для удобства работы с данными которые возврашает запрос.

Это сообщение отредактировал(а) KuMa1104 - 6.6.2012, 15:15


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
erm0l0v
Дата 6.6.2012, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



Вы можете сделать представление TestSelect, если NHibernate умеет с ними работать.

Попробуйте в запросе с помощью as задать имена возвращаемых строк, по идеи они должны быть QuestionGroupDescription и IsActive но мало ли, может SQL назвал их как то по своему.

А query.List<System.Object[]>() возвращает лист из массивов объектов, то есть каждый элемент листа это коллекция полей перечисленных в select? Просто странно что он пытается привести массив объектов к одному объекту.
PM MAIL   Вверх
KuMa1104
Дата 6.6.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 541
Регистрация: 16.4.2009
Где: Ростов-на-Дону

Репутация: нет
Всего: 3



Нашел вот такая штука.

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  спасибо за советы.


--------------------
Галактика – суровая штука. Чтобы в ней выжить, надо знать, где твое полотенце.

Время - штука относительная... а время обеда - ещё более относительная
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1111 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.