Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.12.2015, 15:54   #1
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию nHibernate, неожиданный cast varchar(255)

Приветствую!

Заметил странное для меня поведение в nHibernate.

Формирую критерию для выполнения запроса. Запрос простой - получить из таблицы записи с Id из списка. Пользуюсь Restrictions.In"/"Restrictions.InG".
Само поле Id у меня имеет тип string (в базе varchar(36)), в нем хранится Guid.

Создаю критерию следующим образом:
Код:
...
var criteria = DetachedCriteria.For<TreeDao>();
criteria.Add(Restrictions.InG("Id", new string[] { "c034e889-3b80-42d3-bdad-5f4e729a905b" }));
return DesignerWorkplaceProvider.Current.Session.List<TreeDao>(criteria).ToList();
Класс TreeDao описан так:
Код:
public class TreeDao : ITreeDao
    {        
        public virtual IList<TreeParentDao> Parents { get; set; }        
        
        public virtual string Id { get; set; }        
        
        public virtual TreeDao Parent { get; set; }        
        
        public virtual string Name { get; set; }        
        
        public virtual string ShortName { get; set; }        
        
        public virtual TreeDao Type { get; set; }        
        
        public virtual TreeDao State { get; set; }
        
        public virtual DateTime CreateDateTime { get; set; }
    }
Маппинг выглядит так:
Код:
public class TreeMap : ClassMap<TreeDao>
    {
        public TreeMap()
        {
            Table("L_TREE");
            Id(x => x.Id)
                .Column("ID")
                .Length(36)                
                .Not.Nullable();

            HasMany(x => x.Parents)
                .KeyColumns.Add("Id", p => p.Name("TREE_CHILD_ID"))
                .Table("L_TREE_PARENTS")
                .LazyLoad()
                .ReadOnly()
                .Cascade.None();

            References(x => x.Parent)
                .Column("PARENT_ID")
                .Nullable();
            Map(x => x.Name)
                .Column("NAME")
                .Length(255)
                .Not.Nullable();
            Map(x => x.ShortName)
                .Column("SHORT_NAME")
                .Length(100)
                .Nullable();
            References(x => x.Type)
                .Column("TYPE_ID")
                .Not.Nullable();
            References(x => x.State)
                .Column("STATE_ID")
                .Not.Nullable();
            Map(x => x.CreateDateTime)
                .Column("CREATE_DATETIME")
                .Not.Nullable();
            Polymorphism.Explicit();
            Cache.ReadWrite();
            DiscriminateSubClassesOnColumn("").Formula("TYPE_ID");
        }
    }
В логах вижу, что программа конвертит передаваемую строку из массива в поле типа varchar(255):
Код:
SELECT this_.ID as ID19_0_, this_.NAME as NAME19_0_, this_.SHORT_NAME as SHORT3_19_0_, 
this_.CREATE_DATETIME as CREATE4_19_0_, this_.PARENT_ID as PARENT5_19_0_, this_.TYPE_ID as TYPE6_19_0_,
 this_.STATE_ID as STATE7_19_0_, this_.TYPE_ID as clazz_0_ FROM L_TREE this_ WHERE this_.ID in (cast(@p0 as VARCHAR(255)))

Parameters:
Name:@p0	Type:VarChar	Used Value:c034e889-3b80-42d3-bdad-5f4e729a905b
Не могу понять, с чем это связано?!

Причем если делать обычный условие Equals, то преобразований (cast-oв) нет:
Код:
criteria.Add(Restrictions.Eq("Id", "c034e889-3b80-42d3-bdad-5f4e729a905b"));
Код:
SELECT this_.ID as ID19_0_, this_.NAME as NAME19_0_, this_.SHORT_NAME as SHORT3_19_0_, 
this_.CREATE_DATETIME as CREATE4_19_0_, this_.PARENT_ID as PARENT5_19_0_, this_.TYPE_ID as TYPE6_19_0_,
 this_.STATE_ID as STATE7_19_0_, this_.TYPE_ID as clazz_0_ FROM L_TREE this_ WHERE this_.ID = @p0
Parameters:
Name:@p0	Type:VarChar	Used Value:c034e889-3b80-42d3-bdad-5f4e729a905b
Помогите, пожалуйста, разобраться.

Заранее спасибо!

Последний раз редактировалось Stilet; 28.12.2015 в 17:58.
ProESM вне форума Ответить с цитированием
Старый 28.12.2015, 16:07   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

выбросить nHibernate как отживший свое время
come-on вне форума Ответить с цитированием
Старый 28.12.2015, 16:54   #3
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

Хорошо :-)

А есть варианты с nHibernate? Просто вся система уже настроена через этот фреймворк
ProESM вне форума Ответить с цитированием
Старый 28.12.2015, 17:01   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Так проблема то в чем? ну конвертит и конвертит, ну и что?
работает же
come-on вне форума Ответить с цитированием
Старый 28.12.2015, 17:09   #5
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

Вытекают 2 проблемы/неудобства:
1) увеличивается скорость работы (для каждого элемента пусть и тратится совсем немного времени на его cast, но если элементов много, более 1000, то это уже заметно);
2) cast в varchar(255) при необходимости только в 36 символах удлиняет саму итоговую SQL строку запроса. Пороговое количество элементов, которые можно уместить в одном запросе, уменьшается. Придется дробить на несколько подзапросов и т.п.

Мне сейчас именно поведение непонятно и, как следствие, вопрос - как можно на это повлиять?
ProESM вне форума Ответить с цитированием
Старый 28.12.2015, 17:14   #6
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
для каждого элемента пусть и тратится совсем немного времени на его cast,
разве для каждого?
come-on вне форума Ответить с цитированием
Старый 28.12.2015, 17:18   #7
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

Да, к сожалению и моему пока непониманию - да, для каждого элемента из списка, который я подставляю в
Код:
criteria.Add(Restrictions.InG("Id", new string[] { "c034e889-3b80-42d3-bdad-5f4e729a905b", 
  "f8984cd8-3409-4c19-8fce-85a5bd2e3161" и т.п. }));

Последний раз редактировалось Stilet; 28.12.2015 в 17:58.
ProESM вне форума Ответить с цитированием
Старый 28.12.2015, 18:23   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от come-on Посмотреть сообщение
выбросить nHibernate как отживший свое время
и что же сейчас современно по вашему?



ТС, а почему не взят нормальный GUID тип?
а так вам стоит к ним идти и писать об этом, слишком узкое все же.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.12.2015, 18:29   #9
ProESM
Пользователь
 
Регистрация: 09.11.2008
Сообщений: 27
По умолчанию

База FireBird, по умолчанию нет такого поля :-(
ProESM вне форума Ответить с цитированием
Старый 28.12.2015, 18:37   #10
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
и что же сейчас современно по вашему?
мало разве? линк, ентити, всякие бейз ферст/ласт и т.д.
Цитата:
ТС, а почему не взят нормальный GUID тип?
так у него и так он, вы посмотрите что сейчас пользуют в базах, никакихъ гуидов, варчар и вперед
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
xml-mapping NHibernate Лета Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 7 13.03.2014 11:23
Подключение к Interbase через NHibernate Axilees Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 15.03.2012 08:09
Nhibernate nats Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 1 01.04.2011 11:10
String большого размера, более 255 String[255] bitSoft Общие вопросы Delphi 9 28.03.2010 19:45
Как изменить в InterBase размер поля varchar(10) на varchar(20) tarakan1983 БД в Delphi 4 23.03.2009 15:35