Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > nhibernate отображать данные в виде некой сушности


Автор: KuMa1104 5.6.2012, 19:36
Здравствуйте 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[]>();



Автор: erm0l0v 6.6.2012, 08:16
Вы можете воспользоваться какой нибудь 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 есть что то подобное...

Автор: KuMa1104 6.6.2012, 15:14
Цитата(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 она созданна просто для удобства работы с данными которые возврашает запрос.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)