Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
product:linq:exaples [15.09.2025 08:02] ekaterina.menkhuzinaproduct:linq:exaples [15.09.2025 13:14] (текущий) ekaterina.menkhuzina
Строка 358: Строка 358:
  
 return costs; return costs;
 +</code>
 +
 +===== Запрос с параметром, для использования предфильтра в excel-отчете =====
 +Cам параметр отдельно:
 +<code csharp>
 +var classifier1 = parameters.GetValueOrDefault<ClassifierItem>("Proizvodstvo___peredel", new ClassifierItem{}).Id; 
 +</code>
 +
 +Фильтр по параметру в основном запросе:
 +<code csharp>
 +.Where(ps => classifier1 != Guid.Empty ? (ps.Proizvodstvo___peredel_93e62e.Id == classifier1) : true)
 +</code>
 +
 +В самом предфильтре значение параметра:
 +<code csharp>
 +Proizvodstvo___peredel
 +</code>
 +
 +<code csharp>
 +var id = parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, null);
 +var startDatePTR = parameters.GetValueOrDefault<DateTime?>(QueryParameters.SpreadsheetReport.StartDate, DateTime.Now); 
 +var idPTR = id; // parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, id);
 +var endDatePTR = parameters.GetValueOrDefault<DateTime?>(QueryParameters.SpreadsheetReport.EndDate, DateTime.Now); 
 +var endDate = endDatePTR.Value.AddDays (1);
 +var currentYear = new DateTime(endDatePTR.Value.Year, 1, 1);
 +var currentYearend = currentYear.AddMonths(12);
 +var k1 = currentYear.AddMonths(3);
 +var k2 = k1.AddMonths(3);
 +var k3 = k2.AddMonths(3);
 +var k4 = k3.AddMonths(3);
 +var y2 = currentYear.AddYears(1);
 +var y3 = currentYear.AddYears(2);
 +var y4 = currentYear.AddYears(3);
 +//***************************************************************************
 +//ФИЛЬТР_1
 +var classifier1 = parameters.GetValueOrDefault<ClassifierItem>("Proizvodstvo___peredel", new ClassifierItem{}).Id; 
 +//***************************************************************************
 +var kt_3 = dataContext.KT_3_f1cf19_List
 +  .Where(kt3 => kt3.GetParentHierarchy<_PTR_predpriyatiya_Holdinga_41f8ea>(true).Any(r => r.Id == idPTR))
 +  .Where(kt3 => kt3.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).Any())
 +  .Where(kt3 => kt3.Status != ProjectStatus.Cancelled )
 +  .OrderBy(kt3 => kt3.CreationDate)
 +  .Select(kt3 => new {
 +    kt3.Name,
 +    MeropriyatieId = kt3.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).FirstOrDefault().Id,
 +    EtapPtrId = (Guid?)kt3.GetParentHierarchy<Etap_PTR_0eed50>(true).FirstOrDefault().Id,
 +    PsId = (Guid?)kt3.GetParentHierarchy<Poziciya_specifikacii_437efa>(true).FirstOrDefault().Id,
 +    
 +    Служебный_тип_для_оборудования = (Guid?)kt3.Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_ab7e86.Id,
 +    kt3.BaselinePlanEndDate,
 +    kt3.ActualEndDate,
 +  })
 +  .ToList();
 +
 +var report22 = dataContext.Poziciya_specifikacii_437efa_List
 +  .Where(ps => ps.Otnoshenie_k_chasti_PTR_c2c87f.Id == Classifier_Otnoshenie_k_chasti_PTR_0d5548.Osnovnaya_chastj_890632c4_Id || ps.Otnoshenie_k_chasti_PTR_c2c87f.Id == null)
 +  .Where(ps => ps.Data_vklyucheniya_v_PTR_73d436 >= startDatePTR.Value)
 +  .Where(ps => ps.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).FirstOrDefault().BaselinePlanStartDate < currentYearend)
 +  .Where(ps => ps.GetParentHierarchy<_PTR_predpriyatiya_Holdinga_41f8ea>(true).Any(r => r.Id == idPTR))
 +  .Where(ps => ps.Status == ProjectStatus.InWork ||
 +               ps.Status == ProjectStatus.NotStarted ||
 +               ps.Status == ProjectStatus.Ready ||
 +               ps.Status == ProjectStatus.Complete ||
 +               ps.Status == ProjectStatus.Freeze
 +           )
 +  .Where(ps => ps.Gruppa_oborudovaniya_fdcaf9.Id == Classifier_Gruppa_oborudovaniya_94eb92.Osnovnoe_0dfc21cd_Id || 
 +             ps.Gruppa_oborudovaniya_fdcaf9.Id == Classifier_Gruppa_oborudovaniya_94eb92.Komplektuyuschee_7517702d_Id)
 +  .Where(ps => ps.Kategoriya_rashodov_d87c7c.Id == Classifier_Kategoriya_rashodov_df2928.Kapitaliziruemie_bcc3e43c_Id)
 +  .Where(ps => ps.Razdel_PTR_730d6c.Id == Classifier_Razdel_PTR_27f85e._22_6200148b_Id)
 +  .Where(ps => classifier1 != Guid.Empty ? (ps.Proizvodstvo___peredel_93e62e.Id == classifier1) : true)
 +  .OrderBy(ps => ps.CreationDate)
 +  .Select(ps => new {
 +    ID_проекта = ps.Id,
 +    Название_проекта = ps.Name,
 +    Производство_передел = ps.Proizvodstvo___peredel_93e62e.Name,
 +    Группа_оборудования = ps.Gruppa_oborudovaniya_fdcaf9.Name,
 +    Отношение_к_части_ПТР = ps.Otnoshenie_k_chasti_PTR_c2c87f.Name,
 +    Код_МПОФ = ps.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).FirstOrDefault().Kod_meropriyatiya_POF_b040c3,
 +    ID_МПОФ = ps.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).FirstOrDefault().Id,
 +    Марка_оборудования = ps.GetChildren<Objekti_OF_5a0b23>().FirstOrDefault().Marka_oborudovaniya_2d9569,
 +    Фирма_страна_производитель = ps.GetChildren<Objekti_OF_5a0b23>().FirstOrDefault().Firma___Strana_proizvoditelj_e5f645,
 +    Фирма_страна_поставщик = ps.GetChildren<Objekti_OF_5a0b23>().FirstOrDefault().Firma___Strana_postavschik_b87136,
 +    ID_узкого_места = (Guid?)ps.Svyazan_s__uzkim_mestom_459c92_08ee48.FirstOrDefault().Id,
 +    Код_узкого_места = ps.Svyazan_s__uzkim_mestom_459c92_08ee48.FirstOrDefault().Kod_uzkogo_mesta_6f8714,
 +    Кол_во = ps.Kol__vo_6a6a43,
 +    Бюджет_ПОФ = ps.GetChildren<Byudzhet_POF_a981b9>().Sum(s => s.Byudzhet_POF_rub_07eb8e),
 +    Дата_включения_в_ПТР = ps.Data_vklyucheniya_v_PTR_73d436,
 +    ФАКТ_платежи = ps.GetChildren<FAKT_Platezhi_8c97d9>().Sum(s => s.Summa_platezha_1627e7),
 +    ФАКТ_платежи_с_предыдущих_лет = ps.GetChildren<FAKT_Platezhi_8c97d9>().Where(f => f.Date < currentYear).Sum(s => s.Summa_platezha_1627e7),
 +    Причины_отклонений = ps.GetChildren<Otchet_o_hode_rabot_868b12>().OrderByDescending(r => r.Date).FirstOrDefault().Prichini_otklonenij_737f87,
 +    Предприятия_холдинга = ps.GetParentHierarchy<_PTR_predpriyatiya_Holdinga_41f8ea>(true).FirstOrDefault().Predpriyatie_Holdinga_d4b276.Name,
 +    Кол_во_Факт = ps.Kol__vo_FAKT_747cbf,
 +    
 +    План_сумма_1_кв = ps.GetChildren<Byudzhet_POF_Grafik_platezhej_947f82>().Where(p => p.Date >= currentYear && p.Date < k1).Sum(s => s.Byudzhet_POF_Platezhi_rub_411552),
 +    План_сумма_2_кв = ps.GetChildren<Byudzhet_POF_Grafik_platezhej_947f82>().Where(p => p.Date >= k1 && p.Date < k2).Sum(s => s.Byudzhet_POF_Platezhi_rub_411552),
 +    План_сумма_3_кв = ps.GetChildren<Byudzhet_POF_Grafik_platezhej_947f82>().Where(p => p.Date >= k2 && p.Date < k3).Sum(s => s.Byudzhet_POF_Platezhi_rub_411552),
 +    План_сумма_4_кв = ps.GetChildren<Byudzhet_POF_Grafik_platezhej_947f82>().Where(p => p.Date >= k3 && p.Date < k4).Sum(s => s.Byudzhet_POF_Platezhi_rub_411552),
 +    
 +    Факт_сумма_1_кв = ps.GetChildren<FAKT_Platezhi_8c97d9>().Where(p => p.Date >= currentYear && p.Date < k1  && p.Date <= endDatePTR).Sum(s => s.Summa_platezha_1627e7),
 +    Факт_сумма_2_кв = ps.GetChildren<FAKT_Platezhi_8c97d9>().Where(p => p.Date >= k1 && p.Date < k2  && p.Date <= endDatePTR).Sum(s => s.Summa_platezha_1627e7),
 +    Факт_сумма_3_кв = ps.GetChildren<FAKT_Platezhi_8c97d9>().Where(p => p.Date >= k2 && p.Date < k3  && p.Date <= endDatePTR).Sum(s => s.Summa_platezha_1627e7),
 +    Факт_сумма_4_кв = ps.GetChildren<FAKT_Platezhi_8c97d9>().Where(p => p.Date >= k3 && p.Date < k4  && p.Date <= endDatePTR).Sum(s => s.Summa_platezha_1627e7),
 +    
 +    Номер_договора = ps.GetParentHierarchy<Dogovor_so_specifikaciej_a302b7>(true).FirstOrDefault().Nomer_dogovora_4c7e89,
 +    
 +    MeropriyatieId = (Guid?)ps.GetParentHierarchy<_Meropriyatie_POF_fada13>(true).FirstOrDefault().Id,
 +    EtapPtrId = (Guid?)ps.GetParentHierarchy<Etap_PTR_0eed50>(true).FirstOrDefault().Id,
 +  })
 +  .ToList()
 +  .Select(p => new{
 +  p.ID_проекта,
 +    p.Название_проекта,
 +    p.Производство_передел,
 +    p.Группа_оборудования,
 +    p.Отношение_к_части_ПТР,
 +    p.Код_МПОФ,
 +    p.ID_МПОФ,
 +    p.Марка_оборудования,
 +    p.Фирма_страна_производитель,
 +    p.Фирма_страна_поставщик,
 +    p.ID_узкого_места,
 +    p.Код_узкого_места,
 +    p.Кол_во,
 +    p.Бюджет_ПОФ,
 +    p.Дата_включения_в_ПТР,
 +    p.ФАКТ_платежи,
 +    p.ФАКТ_платежи_с_предыдущих_лет,
 +    p.Причины_отклонений,
 +    p.Предприятия_холдинга,
 +    p.Кол_во_Факт,
 +    
 +    p.План_сумма_1_кв,
 +    p.План_сумма_2_кв,
 +    p.План_сумма_3_кв,
 +    p.План_сумма_4_кв,
 +    
 +    p.Факт_сумма_1_кв,
 +    p.Факт_сумма_2_кв,
 +    p.Факт_сумма_3_кв,
 +    p.Факт_сумма_4_кв,
 +    
 +    КТ_ТЗ_план = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.TZ_i_konkursnaya_dokumentaciya_utverzhdeni_79c8892e_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .BaselinePlanEndDate ??
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.TZ_i_konkursnaya_dokumentaciya_utverzhdeni_79c8892e_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .BaselinePlanEndDate,
 +    
 +    КТ_ТЗ_факт = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.TZ_i_konkursnaya_dokumentaciya_utverzhdeni_79c8892e_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .ActualEndDate ?? 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.TZ_i_konkursnaya_dokumentaciya_utverzhdeni_79c8892e_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .ActualEndDate,
 +    
 +    КТ_Конкурс_план = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Konkurs_zavershen_9b06d84d_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .BaselinePlanEndDate ?? 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Konkurs_zavershen_9b06d84d_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .BaselinePlanEndDate,
 +    
 +    КТ_Конкурс_факт = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Konkurs_zavershen_9b06d84d_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .ActualEndDate ??
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Konkurs_zavershen_9b06d84d_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .ActualEndDate,
 +    
 +    КТ_Договор_план = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Dogovor_zaklyuchen_3a8ff8d9_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .BaselinePlanEndDate ??
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Dogovor_zaklyuchen_3a8ff8d9_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .BaselinePlanEndDate,
 +    
 +    КТ_Договор_факт =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Dogovor_zaklyuchen_3a8ff8d9_Id)
 +        .FirstOrDefault(k => k.EtapPtrId == p.EtapPtrId && k.EtapPtrId != null)?
 +        .ActualEndDate ??
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Dogovor_zaklyuchen_3a8ff8d9_Id)
 +        .FirstOrDefault(k => k.MeropriyatieId == p.MeropriyatieId && k.EtapPtrId == null)?
 +        .ActualEndDate,
 +    
 +    КТ_Поставка_план =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Postavka_osuschestvlena_d8967234_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .BaselinePlanEndDate,
 +    КТ_Поставка_факт =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Postavka_osuschestvlena_d8967234_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .ActualEndDate,
 +    
 +    КТ_Монтаж_план = 
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Montazh_osuschestvlen_73254f39_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .BaselinePlanEndDate,
 +    КТ_Монтаж_факт =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Montazh_osuschestvlen_73254f39_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .ActualEndDate,
 +    
 +    КТ_Ввод_в_Э_план =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Oborudovanie_vvedeno_v_ekspluataciyu_c2bc6e62_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .BaselinePlanEndDate,
 +    КТ_Ввод_в_Э_факт =
 +      kt_3
 +        .Where(k => k.Служебный_тип_для_оборудования == Classifier_Sluzhebnij_Tip_KT_dlya_oborudovaniya_SMR_611543.Oborudovanie_vvedeno_v_ekspluataciyu_c2bc6e62_Id)
 +        .FirstOrDefault(k => k.PsId == p.ID_проекта && k.PsId != null)?
 +        .ActualEndDate,
 +    
 +    p.Номер_договора,
 +  })
 +    .Select(p => new{
 +    p.ID_проекта,
 +    p.Название_проекта,
 +    p.Производство_передел,
 +    p.Группа_оборудования,
 +    p.Отношение_к_части_ПТР,
 +    p.Код_МПОФ,
 +    p.ID_МПОФ,
 +    p.Марка_оборудования,
 +    p.Фирма_страна_производитель,
 +    p.Фирма_страна_поставщик,
 +    p.ID_узкого_места,
 +    p.Код_узкого_места,
 +    p.Кол_во,
 +    p.Бюджет_ПОФ,
 +    p.Дата_включения_в_ПТР,
 +    p.ФАКТ_платежи,
 +    p.ФАКТ_платежи_с_предыдущих_лет,
 +    p.Причины_отклонений,
 +    p.Предприятия_холдинга,
 +    
 +    p.План_сумма_1_кв,
 +    p.План_сумма_2_кв,
 +    p.План_сумма_3_кв,
 +    p.План_сумма_4_кв,
 +    
 +    p.Факт_сумма_1_кв,
 +    p.Факт_сумма_2_кв,
 +    p.Факт_сумма_3_кв,
 +    p.Факт_сумма_4_кв,
 +    
 +    p.КТ_ТЗ_план,
 +    КТ_ТЗ_факт = p.КТ_ТЗ_факт < endDate ? p.КТ_ТЗ_факт : null,
 +    p.КТ_Конкурс_план,
 +КТ_Конкурс_факт = p.КТ_Конкурс_факт < endDate ? p.КТ_Конкурс_факт : null,
 +    p.КТ_Договор_план,
 +КТ_Договор_факт = p.КТ_Договор_факт < endDate ? p.КТ_Договор_факт : null,
 +    p.КТ_Поставка_план,
 +КТ_Поставка_факт = p.КТ_Поставка_факт < endDate ? p.КТ_Поставка_факт : null,
 +    p.КТ_Монтаж_план,
 +КТ_Монтаж_факт = p.КТ_Монтаж_факт < endDate ? p.КТ_Монтаж_факт : null,
 +    p.КТ_Ввод_в_Э_план,
 +КТ_Ввод_в_Э_факт = p.КТ_Ввод_в_Э_факт < endDate ? p.КТ_Ввод_в_Э_факт : null,
 +    p.Номер_договора,
 +    p.Кол_во_Факт,
 +          
 +  })
 +  .ToList()
 +  .OrderBy(o => o.Производство_передел)
 +  .ThenByDescending(o => o.Группа_оборудования)
 +  .ThenBy(o => o.Код_МПОФ);
 +
 +return report22;
 +</code>
 +
 +===== Объединение трудозатрат по ресурсам, проектам =====
 +<code csharp>
 +var Today = DateTime.Today;
 +var ThisMonth = new DateTime (Today.Year, Today.Month, 1);
 +//var EndMonth = ThisMonth.AddYears(2).AddMonths(-1);
 +var IDprj = parameters.GetValueOrDefault<Guid>("RootProjectId", new Guid("402b52cf-65d2-4c94-9e8b-f141e77aac55"));
 +var Person = dataContext.Persons.Select(a => new {a.Id, a.LastName}).ToList();
 +
 +var Costs = dataContext.ProjectCosts
 + .Where( p => p.Project.Name != null && p.Value != 0 && p.Project.GetParentHierarchy<Project>(true).Any(x => x.Id == IDprj))
 +  .Select( p => new {
 +              Договор = p.Project.GetParentHierarchy<Proekt_b31b01>(true).FirstOrDefault().Name,
 +              Ресурс = p.Person.LastName,
 +              ID_Ресурса = p.Person.Id,
 +              Трудозатраты = p.Value,              
 +            }).ToList().GroupBy(u=>new {u.Договор, u.Ресурс}, (key, group) => new {
 + Договор = key.Договор,
 + Ресурс = key.Ресурс,
 +  ID_Ресурса = group.FirstOrDefault().ID_Ресурса.ToString(),
 + Трудозатраты = Math.Round(group.Sum(a => a.Трудозатраты))}).OrderBy(x => x.Договор).ToList();
 +
 +var FactCost = dataContext.Uchet_vremeni_977ff0_List
 + .Where (p => p.Project.Name != null && p.Summa_06ff93 != null && p.Project.GetParentHierarchy<Project>(true).Any(x => x.Id == IDprj))
 +  .Select(p => new{
 +              Договор = p.Project.GetParentHierarchy<Proekt_b31b01>(true).FirstOrDefault().Name,
 +              ID_Ресурса = p.Resurs_caaaaa,
 +              Факт = p.Summa_06ff93,              
 +  })
 +  .ToList()
 +  .Select(p => new {
 +              p.Договор,
 +              Ресурс = Person.Where(a => a.Id.ToString() == p.ID_Ресурса).FirstOrDefault().LastName,
 +              p.ID_Ресурса,
 +              p.Факт
 +            })
 +  .ToList()
 +  .GroupBy(u=>new {u.Договор, u.ID_Ресурса}, (key, group) => new {
 + Договор = key.Договор,
 +              Ресурс = group.FirstOrDefault().Ресурс,
 + ID_Ресурса = key.ID_Ресурса.ToString(),
 + Факт = Math.Round((double)group.Sum(a => a.Факт))}).OrderBy(x => x.Договор).ToList();
 +
 +var CorrCost = dataContext.Korrektirovka_videlennih_chasov_421cbf_List
 +.Where (p => p.Project.Name != null && p.Summa_06ff93 != null && p.Project.GetParentHierarchy<Project>(true).Any(x => x.Id == IDprj))
 +  .Select(p => new{
 +              Договор = p.Project.GetParentHierarchy<Proekt_b31b01>(true).FirstOrDefault().Name,
 +              ID_Ресурса = p.Resurs_caaaaa,
 +              Корректировка = p.Summa_06ff93,
 +              Дата = p.Date
 +  })
 +  .ToList()
 +  .Select(p => new {
 +              p.Договор,
 +              Ресурс = Person.Where(a => a.Id.ToString() == p.ID_Ресурса).FirstOrDefault().LastName,
 +              p.ID_Ресурса,
 +              p.Корректировка,
 +              Месяц_Корректировки = new DateTime (p.Дата.Value.Year, p.Дата.Value.Month, 1)
 +            })
 +  .ToList()
 +  .GroupBy(u=>new {u.Договор, u.ID_Ресурса}, (key, group) => new {
 + Договор = key.Договор,
 +              Ресурс = group.FirstOrDefault().Ресурс,
 + ID_Ресурса = key.ID_Ресурса.ToString(),
 + Корректировка = Math.Round((double)group.Sum(a => a.Корректировка)),
 +              }).OrderBy(x => x.Договор).ToList();
 +
 +var JoinCost1 = FactCost.GroupJoin(Costs, x => new {x.ID_Ресурса, x.Договор}, u => new {u.ID_Ресурса, u.Договор}, (x,u) => new{
 + Договор = x.Договор,
 + Ресурс = x.Ресурс,
 +  ID_Ресурса = x.ID_Ресурса,
 +  Трудозатраты = u.Sum(a =>a.Трудозатраты),
 +  Факт = x.Факт
 + }).ToList();
 +var JoinCost2 = Costs.GroupJoin(FactCost, x => new {x.ID_Ресурса, x.Договор}, u => new {u.ID_Ресурса, u.Договор}, (x,u) => new{
 + Договор = x.Договор,
 + Ресурс = x.Ресурс,
 +  ID_Ресурса = x.ID_Ресурса,
 +  Трудозатраты = x.Трудозатраты,
 +  Факт = u.Sum(a=>a.Факт)
 + }).ToList();
 +
 +var UnionCost1 = JoinCost1.Union(JoinCost2).ToList();
 +
 +var JoinCost3 = UnionCost1.GroupJoin(CorrCost, x => new {x.ID_Ресурса, x.Договор}, u => new {u.ID_Ресурса, u.Договор}, (x,u) => new{
 + Договор = x.Договор,
 + Ресурс = x.Ресурс,
 +  ID_Ресурса = x.ID_Ресурса,
 +  Трудозатраты = x.Трудозатраты,
 +  Факт = x.Факт,
 +  Корректировка = u.Sum(a=>a.Корректировка),
 + }).ToList();
 +var JoinCost4 = CorrCost.GroupJoin(UnionCost1, x => new {x.ID_Ресурса, x.Договор}, u => new {u.ID_Ресурса, u.Договор}, (x,u) => new{
 + Договор = x.Договор,
 + Ресурс = x.Ресурс,
 +  ID_Ресурса = x.ID_Ресурса,
 +  Трудозатраты = u.Sum(a =>a.Трудозатраты),
 +  Факт = u.Sum(a => a.Факт),
 +  Корректировка = x.Корректировка,
 + }).ToList();
 +
 +var UnionCost2 = JoinCost3.Union(JoinCost4).ToList();
 +
 +var CostSum = UnionCost2
 +
 +  .Select( p => new {
 +              Договор = p.Договор,
 +              Ресурс = "",
 +              ID_Ресурса = "",
 +              Трудозатраты = p.Трудозатраты,
 +              Факт = p.Факт,
 +              Корректировка = p.Корректировка,
 +            }).ToList().GroupBy(u=>new {u.Договор}, (key, group) => new {
 + Договор = key.Договор,
 + Ресурс = key.Договор,
 +  ID_Ресурса = "",
 + Трудозатраты = Math.Round(group.Sum(a => a.Трудозатраты)),
 +                Факт = Math.Round(group.Sum(a => a.Факт)),
 +                }).OrderBy(x => x.Договор).ToList();
 +
 +var Result = UnionCost2.Concat(CostSum).OrderBy(x => x.Ресурс).OrderBy(x => x.Договор).ToList();
 +
 +return Result;
 +</code>
 +
 +===== Поиск задач в проекте с максимальным отклонением =====
 +<code csharp>
 +var сегодня = DateTime.Now;
 +
 +var zadacha = dataContext.Zadacha_2b33fa_List
 +      .Where(p => p.TimeReserve == 0 && p.Status == ProjectStatus.InWork)
 +      .Where(p => p.GetParentHierarchy<Project>(false).Where(p => p is IT__proekt_ff08df ||  p is Proekt_a3e2fb || p is Proekt_stroiteljstva_OKS_f001b5).FirstOrDefault().Name != null)
 +      .Select(p => new { 
 +          Проект_ID =   (Guid?)p.GetParentHierarchy<Project>(false).Where(p => p is IT__proekt_ff08df ||  p is Proekt_a3e2fb || p is Proekt_stroiteljstva_OKS_f001b5).FirstOrDefault().Id, 
 +          Проект_name = p.GetParentHierarchy<Project>(false).Where(p => p is IT__proekt_ff08df ||  p is Proekt_a3e2fb || p is Proekt_stroiteljstva_OKS_f001b5).FirstOrDefault().Name, 
 +          Задача_КП = p.Name,
 +          Задача_КП_ID = p.Id,
 +          УДО = p.BaselinePlanEndDate,
 +          ПДО = p.SystemEndDate,
 +          ФДО = p.ActualEndDate,
 +          p.CalendarId,    })
 +  .ToList();
 + var allzadacha = zadacha
 +  .Select(r => new {
 +             r.Проект_ID, 
 +             r.Проект_name, 
 +             r.Задача_КП,
 +             r.Задача_КП_ID,
 +              r.УДО,
 +              r.ПДО,
 +              r.ФДО,
 +              r.CalendarId,
 +              Отклонение_Задач =  r.УДО != null ?  Math.Round(workCalendars.GetWorkCalendar(r.CalendarId).GetWorktimeDays(r.УДО.Value.Date, r.ПДО.Value.Date)) : 0,   }).ToList();
 +//return allzadacha;
 +
 +var id = parameters.GetValueOrDefault<Guid?>(QueryParameters.SpreadsheetReport.ProjectId, null); 
 +var idproject = id;
 +var Katalog = parameters.GetValueOrDefault<string>("Katalog", "1d1ac40d-156b-4726-b2be-877aae71deaa");
 +var projects = dataContext.Projects
 +      .Where(p => p is IT__proekt_ff08df ||  p is Proekt_a3e2fb || p is Proekt_stroiteljstva_OKS_f001b5)
 +      .Where(d => (Guid?)d.GetParentHierarchy<Katalog_743df4>(true).FirstOrDefault().Id == new Guid(Katalog))
 +      .Select(p => new { 
 +          p.Id, 
 +          p.Name, 
 +           
 +          УДН = p.BaselinePlanStartDate,
 +          УДО = p.BaselinePlanEndDate,
 +          ПДН = p.SystemStartDate,
 +          ПДО = p.SystemEndDate,
 +          ФДН = p.ActualStartDate,
 +          ФДО = p.ActualEndDate,
 +          p.CalendarId,
 +  //        Длительность = DbFunctions.DiffDays(p.SystemStartDate, p.SystemEndDate),
 +        ПДО_Задача_на_КП = p.GetChildrenHierarchy<Zadacha_2b33fa>(true).Where(p => p.TimeReserve == 0 && p.Status == ProjectStatus.InWork).OrderByDescending(r => r.SystemEndDate).FirstOrDefault().SystemEndDate,  
 +        УДО_Задача_на_КП = p.GetChildrenHierarchy<Zadacha_2b33fa>(true).Where(p => p.TimeReserve == 0 && p.Status == ProjectStatus.InWork).OrderByDescending(r => r.SystemEndDate).FirstOrDefault().BaselinePlanEndDate,         
 +
 +        Задача_КП = p.GetChildrenHierarchy<Zadacha_2b33fa>(false).Where(p => p.TimeReserve == 0 && p.Status == ProjectStatus.InWork).OrderByDescending(r => r.SystemEndDate).FirstOrDefault().Name,
 +        Задача_КП_ID = (Guid?)p.GetChildrenHierarchy<Zadacha_2b33fa>(false).Where(p => p.TimeReserve == 0 && p.Status == ProjectStatus.InWork).OrderByDescending(r => r.SystemEndDate).FirstOrDefault().Id,
 +        Процент_вып_проекта = p.PercentComplete,
 +            })
 +
 +  .ToList()
 +  .Select(r => new{
 +            
 +              r.Id, 
 +              r.Name, 
 +            
 +          r.УДН,
 +          r.УДО,
 +          r.ПДН,
 +          r.ПДО,
 +          r.ФДН,
 +          r.ФДО,
 +          r.CalendarId,
 +   //       r.Длительность,
 +         
 +    r.Задача_КП_ID,       
 +    r.Задача_КП,
 +    r.ПДО_Задача_на_КП,  
 +    r.УДО_Задача_на_КП,
 +    Отклонение_Задача_на_КП = r.Задача_КП_ID != null && r.УДО_Задача_на_КП != null ?  Math.Round(workCalendars.GetWorkCalendar(r.CalendarId).GetWorktimeDays(r.УДО_Задача_на_КП.Value.Date, r.ПДО_Задача_на_КП.Value.Date)) : 0,
 +    r.Процент_вып_проекта,
 +
 +    Отклонение_Список_Задач = allzadacha.Where(d => d.Проект_ID == r.Id ).Select (h => h.Задача_КП) , 
 +    Отклонение_Задача_на_КП2 = allzadacha.Where(d => d.Проект_ID == r.Id ).Any() ? allzadacha.Where(d => d.Проект_ID == r.Id).OrderByDescending(k => k.Отклонение_Задач).FirstOrDefault().Отклонение_Задач : 0,   
 +    Отклонение_Задача_на_КП_max = allzadacha.Where(d => d.Проект_ID == r.Id ).Any() ? allzadacha.Where(d => d.Проект_ID == r.Id ).Max(g => g.Отклонение_Задач) : 0, 
 + })
 +.ToList();
 +return projects;
 +
 +</code>
 +
 +===== Последняя по времени запись в протоколе =====
 +<code csharp>
 +// Пример linq-запроса на событие последнего изменения объекта:
 +var projectId = parameters.GetValueOrDefault<Guid?>("ProjectId", new Guid("a6ed1995-582c-42d3-afa0-6db8c280b212")); // UID объекта
 +var lastEvent = dataContext.Events // получаем события  
 +    .Where(p => p.ObjectId == projectId) // фильтруем по id объекта  
 +    .OrderByDescending(p => p.Time) // сортировка по полю Time  
 +    .Select(p => new  
 +    {  
 +        Время = p.Time,  
 +        UID_пользователя = p.PersonId,  
 +        Текст = p.MessageHtml,  
 +        ИД_проекта = p.ObjectId,  
 +        Данные_события = p.MessageData,  
 +        Тип_события = p.Type,  
 +    })  
 +    .Take(1) // берем только одну запись  
 +    .ToList(); // преобразуем в список  
 +
 +return lastEvent; // Возвращаем список, содержащий последнюю запись или пустой список
 </code> </code>