Неправильный вывод лямбды SQL с использованием вложенного выбора
У меня есть 2 таблицы, Terms
а также Site_Program_Term
:
Terms
столбцы: Id, SiteId, Имя, IsHoliday, DateStart, DateEnd, Год, IsActiveSite_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()
нет).