Это должно дать мне счет всех программ для набора определенных Срок , Год и Сайт.
Но ваше условие Where
включает толькоYear
и Site
, но не Term
.Так что
.Where(spt => spt.SiteId == id && spt.Year == t.Year)
должно быть на самом деле:
.Where(spt => spt.SiteId == id && spt.Year == t.Year && spt.TermId == t.Id)
Обратите внимание, что если вы случайно используете Entity Framework (Core) и правильно настроили свойство навигации в классе Term
например,
public class Term
{
// ...
public List<Site_Program_Term> SiteProgramTerms { get; set; }
}
, тогда вы можете переписать ваш запрос как
var terms = db.Terms
.Where(t => t.SiteId == id && t.IsActive)
.Select(t => new
{
Id = t.Id,
SiteId = t.SiteId,
Name = t.Name,
IsHoliday = t.IsHoliday,
DateStart = t.DateStart,
DateEnd = t.DateEnd,
Year = t.Year,
PubProgram = t.SiteProgramTerms.Where(spt => spt.SiteId == id && spt.Year == t.Year).Count()
})
.OrderBy(n => n.DateStart)
.ToList();
Обратите внимание, что на этот раз вам не нужно включать условие spt.TermId == t.Id
, поскольку свойство SiteProgramTerms
содержит толькоусловия программы сайта с TermId
, что соответствует Id
из Term
.Также обратите внимание, что первый .ToList()
должен быть опущен, поскольку он заставляет запрос отправляться на сервер SQL в виде нескольких SELECT
запросов (в отличие от одного SELECT
, когда .ToList()
отсутствует).