0

我有 2 张桌子,Terms并且Site_Program_Term

  • Terms列:Id、SiteId、Name、IsHoliday、DateStart、DateEnd、Year、IsActive
  • Site_Program_Term列:Id、ProgName、SiteId、TermId、Year

使用上面的 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();
4

1 回答 1

0

它应该为我提供一组特定期限、年份和站点的所有程序的计数。

但是您的Where条件仅包括Yearand 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属性仅包含TermIdId. Term另请注意,.ToList()应省略第一个,因为它会导致查询作为多个查询发送到 SQL 服务器(而不是在不存在时SELECT仅发送一个)。SELECT.ToList()

于 2018-09-15T07:43:29.250 回答