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

Сообщение Linq EF и коррелирующие запросы от 27.08.2015 9:15

Изменено 27.08.2015 9:39 Serginio1

Добрый всем день. Наконец дошли руки и до 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 TEntity ПолучитьЭлементСправочника<TEntity>(string ID) where TEntity : class
        {


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

        }


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

(Почему то нет выборя языка для подсветки кода)
Добрый всем день. Наконец дошли руки и до 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>();

        }
        }


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

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

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