LINQ Provider

Написание текста документации пока в работе... :(

Работа с табличными частями

Работа в слаботипизированных запросах

Для поддержки работы с табличными частями предназначен метод GetTablePartRecords класса VanessaSharp.Data.Linq.OneSDataRecord. Полное описание метода:


                            public IEnumerable<OneSDataRecord> GetTablePartRecords(string tablePartName)
                    
где tablePartName – имя табличной части источника данных. Метод возвращает последовательность записей табличной части. Данный метод поддерживается в linq-запросе. Можно написать, например, следующий код:

                            using (var dataCtx = new OneSDataContext("СтрокаПодключения"))
                            {
                                var query = from r in dataCtx.GetRecords("ИсточникСТабличнойЧастью")
                                select new { 
                                       Id = r.GetInt64("Идентификатор"), 
                                       Lines = r.GetTablePartRecords("ТабличнаяЧастьИсточника") 
                                       };

                                 foreach (var item in query)
                                 {
      		                    foreach (var line in item.Lines)
                                    {
                                        WriteLine(line.GetString("Наименование"));
                                    }
                                }
                            }
                    
При этом на 1С будет отправлен SQL-запрос следующего вида:

                       SELECT Идентификатор, ТабличнаяЧастьИсточника
                       FROM ИсточникСТабличнойЧастью
                    
Если требуется, чтобы запрос выбирал только определенные поля табличных частей, то их надо выбрать внутри запроса, например, так:

                        var query2 = from r in dataCtx.GetRecords("ИсточникСТабличнойЧастью")
                        select new {
                                        Id = r.GetInt64("Идентификатор"),
                                        Lines = from l in r.GetTablePartRecords("ТабличнаяЧастьИсточника")
                                        select new { 
                                                        Name = l.GetString("Наименование"),
                                                        Quantity = l.GetInt32("Количество") 
                                        }
                               }; 
                    
Тогда в 1С будет отправлен запрос следующего вида:

                        SELECT Идентификатор, ТабличнаяЧастьИсточника.(Наименование, Количество)
                        FROM ИсточникСТабличнойЧастью
                    

Работа в строготипизированных запросах

Для указания соответствия члену CLR-типа табличной части источника данных 1С также применяется атрибут VanessaSharp.Data.Linq.OneSDataColumnAttribute. Только при этом вторым аргументом конструктора данного атрибута необходимо указать, что типом данных в колонке является табличная часть установив значение VanessaSharp.Data.Linq.OneSDataColumnKind.TablePart. При этом член типа (публичное поле или свойство) ассоциированный с табличной частью должен иметь тип System.Collections.Generic.IEnumerable<T>. Где T – тип описывающий строку табличной части. В качестве Т допустимо использовать VanessaSharp.Data.Linq.OneSDataRecord. Например, опишем тип с табличной частью следующим образом:


                        [OneSDataSource("Документ.Счет")]
                        public sealed class Invoice
                        {
                            [OneSDataColumn("Номер")]
                            public string Number { get; set; }

                            [OneSDataColumn("ДатаДокумента")]
                            public DateTime DocumentDate { get; set; }

                            [OneSDataColumn("Состав", OneSDataColumnKind.TablePart)]
                            public IEnumerable<OneSDataRecord> Lines { get; set; }
                        }
                    
Тогда можно записать следующий запрос:

                        var query3 = from i in dataCtx.Get<Invoice>()
                                     select new {
                        	                    i.Number,
                                                    InvoiceItems = from r in i.Lines
                                                                   select new {
                                                                     ItemNumber = r.GetInt32("Номер"), 
                                                                     PositionName = r.GetString("Наименование"), 
                                                                     Quantity = r.GetInt32("Количество") 	
                                                                  }
                                                };
                    
Можно типизировать строки табличной части, описав их тип в .Net и применив атрибут VanessaSharp.Data.Linq.OneSDataColumnAttribute на членах типа, для указания соответствия реквизитам табличной части в 1С. Например опишем тип табличной части следующим образом:

                        public sealed class InvoiceLine
                        {
                            [OneSDataColumn("Номер")]
                            public int Number { get; set; }

                            [OneSDataColumn("Наименование")]
                            public string Name { get; set; }

                            [OneSDataColumn("Количество")]
                            public int Quantity { get; set; }

                            [OneSDataColumn("Цена")]
                            public decimal Price { get; set; }

                            [OneSDataColumn("Сумма")]
                            public decimal Summa { get; set; }
                        }
                    
Тогда определение свойства Invoice.Lines можно переписать так:

                        [OneSDataColumn("Состав", OneSDataColumnKind.TablePart)]
                        public IEnumerable<InvoiceLine> Lines { get; set; }
                    
После этого linq-запрос можно переписать следующим образом:

                        var query3 = from i in dataCtx.Get<Invoice>()
                        select new {
             		                i.Number,
                                        InvoiceItems = from r in i.Lines
                                                       select new { 
                                                                    ItemNumber = r.Number,
                                                                    PositionName = r.Name,
                                                                    r.Quantity 
                                                                  }
                                  };