Неправильный вывод лямбды SQL с использованием вложенного выбора

У меня есть 2 таблицы, Terms а также Site_Program_Term:

  • Terms столбцы: Id, SiteId, Имя, IsHoliday, DateStart, DateEnd, Год, IsActive
  • Site_Program_Term столбцы: Id, ProgName, SiteId, TermId, Год

Используя вышеупомянутые 2 таблицы, мне нужно отобразить вывод с главным образом ниже столбцов

Name, StartDate, EndDate, NumberOfPrograms

Я получаю желаемый результат, но NumberOfPrograms не показывает правильные значения. Он должен дать мне счет всех программ для набора определенного срока, года и сайта.

Заранее спасибо.

Ниже приведен базовый код.

var terms = db.Terms.Where(t => t.SiteId == id && t.IsActive).ToList().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 = ( 
                    db.Site_Program_Term
                    .Where (spt => spt.SiteId == id && spt.Year == t.Year)
                    .Select(s => s).Count()
                ),
            }).OrderBy(n => n.DateStart).ToList();

1 ответ

Он должен дать мне счет всех программ для набора определенного срока, года и сайта.

Но твой 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() нет).

Другие вопросы по тегам