Linq EF и коррелирующие запросы
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.08.15 09:15
Оценка:
Добрый всем день. Наконец дошли руки и до Linq.

Прошу совета по нескольким проблемам. Искал, но не нашел.

Например есть такой запрос

 var бд = Константы1С.ГлобальныйКонтекст.db;
            var query = from Константа in бд.ТаблицаКонстанты
                         where Константа.ID == 9697
                         orderby Константа.DATE descending, Константа.TIME descending, Константа.DOCID descending, Константа.ROW_ID descending
                         select Константа;
                //         select new Константы1С.ЗначениеПериодического { Значение = Константа.VALUE }).Take(1);

            var query2= (from спр in бд.Спр_ДляПериодических
                            select new
                            {
                                Наименование=спр.Наименование,
                                ДатаСпр=спр.ДатаСпр,
                                Периодические=(from прериод in  query.Where(ю=> ю.OBJID==спр.ID && ю.DATE<=спр.ДатаСпр).Take(1)
                                                   select new 
                                                   {
                                                      Значение=прериод.VALUE,
                                                       Дата=прериод.DATE
                                                   
                                                   }).FirstOrDefault()

                            }
                             );

            foreach (var элем in query2)
            {
               
               Console.WriteLine("{0}.{1} - {2}", элем.Наименование,  элем.ДатаСпр, элем.Периодические);

               
            }


Так вот Периодические возвращается
System.Data.Entity.Core.Common.Internal.Materialization.CompensatingCollection<<>f__AnonymousType0<string,System.DateTime>>

Пока писал уже нашел решение FirstOrDefault()

Интересно, что генерится такой запрос
SELECT 
    1 AS [C1], 
    [Extent1].[DESCR] AS [DESCR], 
    [Extent1].[SP9700] AS [SP9700], 
    [Limit1].[ROW_ID] AS [ROW_ID], 
    [Limit1].[VALUE] AS [VALUE], 
    [Limit1].[DATE] AS [DATE]
    FROM  [dbo].[SC9691] AS [Extent1]
    OUTER APPLY  (SELECT TOP (1) [Project1].[ROW_ID] AS [ROW_ID], [Project1].[DATE] AS [DATE], [Project1].[VALUE] AS [VALUE]
        FROM ( SELECT 
            [Extent2].[ROW_ID] AS [ROW_ID], 
            [Extent2].[DATE] AS [DATE], 
            [Extent2].[VALUE] AS [VALUE], 
            [Extent2].[DOCID] AS [DOCID], 
            [Extent2].[TIME] AS [TIME]
            FROM [dbo].[_1SCONST] AS [Extent2]
            WHERE (9697 = [Extent2].[ID]) AND ([Extent2].[OBJID] = [Extent1].[ID]) AND ([Extent2].[DATE] <= [Extent1].[SP9700])
        )  AS [Project1]
        ORDER BY [Project1].[DATE] DESC, [Project1].[TIME] DESC, [Project1].[DOCID] DESC, [Project1].[ROW_ID] DESC ) AS [Limit1]



Вопрос такой как создать обобщенную функцию.
в 1С есть поля неопределенного справочника где есть тип и ид


var db = Константы1С.ГлобальныйКонтекст.db;
                var query2 = from спр in db.Спр_Номенклатура
                             where спр.ID=ID 
                             select спр;
                return query2.SingleOrDefault();

То есть хотелосбы обощенную функцию Типа

 public class ИнтерфейсИД
    {
        public virtual string ID { get; set; }
    
    }
    public partial class Model1 : DbContext
    {

        public TEntity ПолучитьЭлементСправочника<TEntity>(string ID) where TEntity : class,ИнтерфейсИД
        {


            var query2 = from спр in this.Set<TEntity>()
                         where спр.ID == ID
                         select спр;
            return query2.SingleOrDefault<TEntity>();

        }
        }


Чтобы получив тип вызвать обобщенную функцию.

Сейчас попробую

(Почему то нет выборя языка для подсветки кода)

03.09.15 07:51: Перенесено из '.NET'
и солнце б утром не вставало, когда бы не было меня
Отредактировано 27.08.2015 10:26 Serginio1 . Предыдущая версия . Еще …
Отредактировано 27.08.2015 9:39 Serginio1 . Предыдущая версия .
Отредактировано 27.08.2015 9:33 Serginio1 . Предыдущая версия .
Отредактировано 27.08.2015 9:32 Serginio1 . Предыдущая версия .
Отредактировано 27.08.2015 9:28 Serginio1 . Предыдущая версия .
Re: И — импортозамещение
От: Qbit86 Кипр
Дата: 27.08.15 09:43
Оценка: -1
Здравствуйте, Serginio1, Вы писали:

S>
var бд = Константы1С.ГлобальныйКонтекст.db;


* Тред этого сообщения зарезервирован для комментариев по поводу именования идентификаторов.
Глаза у меня добрые, но рубашка — смирительная!
Re: Linq EF и коррелирующие запросы
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.08.15 09:51
Оценка:
Здравствуйте, Serginio1, Вы писали:

Получилось так

  public class КлассИД
    {
        public virtual string ID { get; set; }
    
    }
    public partial class Model1 : DbContext
    {

        public TEntity ПолучитьЭлементСправочника<TEntity>(string ID) where TEntity : КлассИД
        {


            var query2 = from спр in this.Set<TEntity>()
                         where спр.ID == ID
                         select спр;
            return query2.SingleOrDefault<TEntity>();

        }





  public partial class ДляПериодических : КлассИД
    {

        public DateTime ДатаДляПериодическихРеквизитов = DateTime.Now;

        [Key]
        [Required]
        [StringLength(9)]
     override   public string ID { get; set; }



Вопрос не будели каких то проблем?
и солнце б утром не вставало, когда бы не было меня
Отредактировано 27.08.2015 10:26 Serginio1 . Предыдущая версия . Еще …
Отредактировано 27.08.2015 9:58 Serginio1 . Предыдущая версия .
Re[2]: И — импортозамещение
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.08.15 09:56
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Здравствуйте, Serginio1, Вы писали:


S>>
var бд = Константы1С.ГлобальныйКонтекст.db;


Q>* Тред этого сообщения зарезервирован для комментариев по поводу именования идентификаторов.


Ну это как раз и делается, что бы писать на русском.

  [Table("SC9691")]
    public partial class ДляПериодических : КлассИД
    {

        public DateTime ДатаДляПериодическихРеквизитов = DateTime.Now;

        [Key]
        [Required]
        [StringLength(9)]
        override public string ID { get; set; }

        [Column("CODE", TypeName = "numeric")]
        [Required]
        public int Код { get; set; }

        [Column("DESCR")]
        [Required]
        [StringLength(25)]
        public string Наименование { get; set; }

        [Column("ISMARK")]
        public bool ПометкаУдаления { get; set; }

        [Column("SP9698")]
        [Required]
        [StringLength(9)] //Перечисление
        public string Перечисление { get; set; }

        [Column("SP9699")]
        [Required]
        [StringLength(13)]
        public string НеопределенныйСправочникId { get; set; }

        [Column("SP9700")]
        [Required]

        public DateTime ДатаСпр { get; set; }

        [Column("SP9701")]
        [Required]
        [StringLength(9)]
        public string НоменклатураId { get; set; }
        virtual public Справочник.Номенклатура Номенклатура { get; set; }

        [NotMapped]
        public DateTime ПериодДата
        {
            get
            {



                return Константы1С.Константы.ДатаДляПериодического(9693, ID, ДатаДляПериодическихРеквизитов);
            }
        }
        [NotMapped]
        public decimal ПериодЧисло
        {
            get
            {

                var query = Константы1С.Константы.ЗапросДляПериодическогоЗначения(9694, ID, ДатаДляПериодическихРеквизитов);
                var res = query.SingleOrDefault();
                if (res == null)
                    return 0M;

                return decimal.Parse(res.Значение, System.Globalization.CultureInfo.InvariantCulture);
            }
        }
        [NotMapped]
        public Int64 ПериодИнт
        {
            get
            {

                var query = Константы1С.Константы.ЗапросДляПериодическогоЗначения(9695, ID, ДатаДляПериодическихРеквизитов);
                var res = query.SingleOrDefault();
                if (res == null)
                    return 0;

                return Int64.Parse(res.Значение, System.Globalization.CultureInfo.InvariantCulture);
            }
        }
        [NotMapped]
        public Справочник.Номенклатура ПериодСПР
        {
            get
            {

                var query = Константы1С.Константы.ЗапросДляПериодическогоЗначения(9696, ID, ДатаДляПериодическихРеквизитов);

                var db = Константы1С.ГлобальныйКонтекст.db;
                var query2 = from спр in db.Спр_Номенклатура
                             join конст in query on спр.ID equals конст.Значение.Substring(0, 9)
                             select спр;
                return query2.SingleOrDefault();
            }
        }
        [NotMapped]
        public string ПериодСтр
        {
            get
            {

                var query = Константы1С.Константы.ЗапросДляПериодическогоЗначения(9697, ID, ДатаДляПериодическихРеквизитов);

                var res = query.SingleOrDefault();
                if (res == null)
                    return null;


                return res.Значение.Substring(0, 10);
            }
        }

    }
и солнце б утром не вставало, когда бы не было меня
Отредактировано 27.08.2015 10:27 Serginio1 . Предыдущая версия .
Re[3]: И — импортозамещение
От: Qbit86 Кипр
Дата: 27.08.15 10:04
Оценка: -2 :))
Здравствуйте, Serginio1, Вы писали:

S>>>
var бд = Константы1С.ГлобальныйКонтекст.db;

Q>>* Тред этого сообщения зарезервирован для комментариев по поводу именования идентификаторов.
S>Ну это как раз и делается, что бы писать на русском.

Милота какая, вокруг аж иконы замироточили в припадке патриотизма.
Глаза у меня добрые, но рубашка — смирительная!
Re[4]: И — импортозамещение
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 27.08.15 10:13
Оценка: :)
Здравствуйте, Qbit86, Вы писали:

Q>Милота какая, вокруг аж иконы замироточили в припадке патриотизма.

Причем тут патриотизм? Я на 1С пишу не из-за патриотизма, а из за того, что мне на русском проще писать, придумывать названия приложений и тд.
Да и поля отображаемых классов тоже на русском. Если ты не заметил это отображение таблиц 1С.
Плохо то, что на C# приходится совмещать языки переключая клавиатуру. Но ничего страшного в этом нет.
А вот правильно заметил нужно

var бд = Константы1С.ГлобальныйКонтекст.db;

заменить на
var бд = Константы1С.ГлобальныйКонтекст.БД;
и солнце б утром не вставало, когда бы не было меня
Отредактировано 27.08.2015 10:27 Serginio1 . Предыдущая версия .
Re[5]: И — импортозамещение
От: Venom  
Дата: 31.08.15 04:28
Оценка: 10 (1)
Здравствуйте, Serginio1, Вы писали:

S>Плохо то, что на C# приходится совмещать языки переключая клавиатуру. Но ничего страшного в этом нет.

> var бд = Константы1С.ГлобальныйКонтекст.бд;

Но переключать ведь всё равно приходится (для "var").
Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.
Раз уж вы извращаетесь с идентификаторами (с точки зрения обычного .net-разработчика), то PS может здорово облегчить вам жизнь, ибо он дает возможность печатать идентификаторы по-русски и не переключать раскладки клавиатуры.
Re[6]: И — импортозамещение
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 31.08.15 05:14
Оценка:
Здравствуйте, Venom, Вы писали:

V>Здравствуйте, Serginio1, Вы писали:


S>>Плохо то, что на C# приходится совмещать языки переключая клавиатуру. Но ничего страшного в этом нет.

>> var бд = Константы1С.ГлобальныйКонтекст.бд;

V>Но переключать ведь всё равно приходится (для "var").

V>Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.
V>Раз уж вы извращаетесь с идентификаторами (с точки зрения обычного .net-разработчика), то PS может здорово облегчить вам жизнь, ибо он дает возможность печатать идентификаторы по-русски и не переключать раскладки клавиатуры.
Спасибо! Совсем про него забыл
и солнце б утром не вставало, когда бы не было меня
Re[2]: И — импортозамещение
От: TK Лес кывт.рф
Дата: 31.08.15 07:33
Оценка: +1
Здравствуйте, Qbit86, Вы писали:

S>>
var бд = Константы1С.ГлобальныйКонтекст.db;

Q>* Тред этого сообщения зарезервирован для комментариев по поводу именования идентификаторов.

В 1С так исторически принято.
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re[6]: И — импортозамещение
От: DarthSidius  
Дата: 31.08.15 21:00
Оценка:
Здравствуйте, Venom, Вы писали:

V>Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.


Перестал он это делать в VS
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 58>>
♠♠♥♠♠♦♥
Re[7]: И — импортозамещение
От: Venom  
Дата: 01.09.15 10:44
Оценка:
Здравствуйте, DarthSidius, Вы писали:

V>>Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.


DS>Перестал он это делать в VS


Как это проявляется?
У меня переводит как в обычном поле ввода.
Еще см. http://rsdn.ru/forum/dotnet/6165297.1
Автор: Venom
Дата: 01.09.15

В целом, пунто не оправдал ожиданий для данной задачи.
Отредактировано 01.09.2015 10:50 Venom . Предыдущая версия .
Re[7]: И — импортозамещение
От: Venom  
Дата: 01.09.15 10:48
Оценка: 5 (1)
Здравствуйте, Serginio1, Вы писали:

V>>Но переключать ведь всё равно приходится (для "var").

V>>Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.
V>>Раз уж вы извращаетесь с идентификаторами (с точки зрения обычного .net-разработчика), то PS может здорово облегчить вам жизнь, ибо он дает возможность печатать идентификаторы по-русски и не переключать раскладки клавиатуры.
S> Спасибо! Совсем про него забыл

Я попробовал, кстати, и пунто свичер переключает раскладки не так как надо, к сожалению.

Дело в том, что после смены раскладки напечатанного слова, он меняет и раскладку ввода, а весь фокус в том, чтобы этого избежать.

Плюс, в последней версии, на которой я тестил, он съедает буквы при множественном переключении раскладки, что не айс.
Такие дела.
Re[7]: И — импортозамещение
От: Venom  
Дата: 01.09.15 10:54
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Спасибо! Совсем про него забыл


Прикрепил бомбочку, чтобы переместить http://rsdn.ru/forum/dotnet/6163749.1
Автор: Venom
Дата: 31.08.15
в "средства разработки", а бомбочка прикрепилась с стартовому сообщению.
Такие дела.
Re[8]: И — импортозамещение
От: DarthSidius  
Дата: 01.09.15 11:54
Оценка: 5 (1)
Здравствуйте, Venom, Вы писали:

V>>>Видел у коллеги пунто свичер, который менял по CTRL раскладку напечатанного слова.


DS>>Перестал он это делать в VS


V>Как это проявляется?


http://clubs.ya.ru/punto/replies.xml?item_no=13410
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 58>>
♠♠♥♠♠♦♥
Re[8]: И — импортозамещение
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 01.09.15 13:04
Оценка: 5 (1)
Здравствуйте, Venom, Вы писали:



V>Я попробовал, кстати, и пунто свичер переключает раскладки не так как надо, к сожалению.


V>Дело в том, что после смены раскладки напечатанного слова, он меняет и раскладку ввода, а весь фокус в том, чтобы этого избежать.


V>Плюс, в последней версии, на которой я тестил, он съедает буквы при множественном переключении раскладки, что не айс.

V>Такие дела.

Ну сейчас попробовал переключает автоматически вполне сносно, выделенное слова по break. Удобно/ Спасибо!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 01.09.2015 13:08 Serginio1 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.