Неправильный вывод лямбды SQL с использованием вложенного выбора - PullRequest
0 голосов
/ 15 сентября 2018

У меня есть 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 Ответ

0 голосов
/ 15 сентября 2018

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

Но ваше условие 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() отсутствует).

...