Информация об изменениях

Сообщение Re: linq2db и Убивец 1С от 27.06.2020 11:35

Изменено 27.06.2020 16:55 Serginio1

Re: linq2db и Убивец 1С
Навеяно https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-efcore-5-0-preview-6/

Так в 1С есть поля неопределенных типов, справочников.
Для неопределенного спаравочника Хотелось бы что типа такого

    switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                _=>null
            }





То есть такое генерилось, но вызывалось как
ПолеНеопределенногоСправочника.Наименование

Можно так

let spr= switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty(),
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty(),
                _=>null
            }

spr?.Наименование


Кроме того можно применять утиную типизацию для классов с одинаковыми именами полей

Начнем с класса предка.

  public   class   СсылочныйТип
    {
 
        [Key]
        [Column("_IDRRef")]
        [MaxLength(16)]
        public  byte[] ID { get; set; }
 
        [NotMapped]
        public  virtual  int  НомерТаблицы { get { return 0; } }
    }


Номер таблицы нам понадобится для неопределенных типов.
Кроме того, мы сможем сделать дженерик метод


public TEntity ПолучитьСсылочныйЭлемент<TEntity>(byte[] ID) where TEntity : СсылочныйТип
        {
 
 
            var query = from спр in this.Set<TEntity>()
                         where спр.ID == ID
                         select спр;
            return query.SingleOrDefault<TEntity>();
 
        }


Тогда можно переписать так

let spr= switch TableNumber
            {
                1=> null,
                2=> ПолучитьСсылочныйЭлемент<Спр_Поставщики>(SprId),
                3=> ПолучитьСсылочныйЭлемент<Спр_Покупатели>.(SprId),
                _=>null
            }

spr?.Наименование


Ну а зная ограничение на поле то просто
ПолеСправочникеопределенногоТипа.Наименование
Re: linq2db и Убивец 1С
Навеяно https://devblogs.microsoft.com/dotnet/announcing-entity-framework-core-efcore-5-0-preview-6/

Так в 1С есть поля неопределенных типов, справочников.
Для неопределенного спаравочника Хотелось бы что типа такого

    switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty()
select new
                     {
                        Наименование
                        
                     },
                _=>null
            }





То есть такое генерилось, но вызывалось как
ПолеНеопределенногоСправочника.Наименование

Можно так

let spr= switch TableNumber
            {
                1=> null,
                2=> бд.Спр_Поставщики.Where(поставщик=> поставщик.Id==SprId).DefaultIfEmpty(),
                3=> бд.Спр_Покупатели.Where(покупатель=> поставщик.Id==SprId).DefaultIfEmpty(),
                _=>null
            }

spr?.Наименование


Кроме того можно применять утиную типизацию для классов с одинаковыми именами полей

Начнем с класса предка.

  public   class   СсылочныйТип
    {
 
        [Key]
        [Column("_IDRRef")]
        [MaxLength(16)]
        public  byte[] ID { get; set; }
 
        [NotMapped]
        public  virtual  int  НомерТаблицы { get { return 0; } }
    }


Номер таблицы нам понадобится для неопределенных типов.
Кроме того, мы сможем сделать дженерик метод


public TEntity ПолучитьСсылочныйЭлемент<TEntity>(byte[] ID) where TEntity : СсылочныйТип
        {
 
 
            var query = from спр in this.Set<TEntity>()
                         where спр.ID == ID
                         select спр;
            return query.SingleOrDefault<TEntity>();
 
        }


Тогда можно переписать так

let spr= switch TableNumber
            {
                1=> null,
                2=> ПолучитьСсылочныйЭлемент<Справочник.Поставщики>(SprId),
                3=> ПолучитьСсылочныйЭлемент<Справочник.Покупатели>.(SprId),
                _=>null
            }

spr?.Наименование


Ну а зная ограничение на поле то просто
ПолеСправочникеопределенногоТипа.Наименование
И автоматически генерировать CASE WHEN