Linq to SQL to return 来自查询的多个计数未 returning 正确的结果

Linq to SQL to return multiple counts from query not returning correct results

我有一个 Linq to SQL 查询,我想 return 三个行数计数。一个用于不等于零的字段 (HaveCount),另一个用于不等于零的另一个字段 (WantCount),另一个用于不等于零的另一个字段 (SaleCount)。

这是我的查询...

var counts = (from a in dc.tblMemberIssues
              join b in dc.vwMembers on a.MemberID equals b.MemberID
              where a.IssueID == issueID
              group a by new { a.HaveCount, a.WantCount, a.SaleCount } into d
              select new
              {
                  HaveCount = d.Count(e => e.HaveCount != 0),
                  WantCount = d.Count(e => e.WantCount != 0),
                  SaleCount = d.Count(e => e.SaleCount != 0)
              }).First();

然而它并没有return预期的结果。我意识到分组是错误的,但我不确定如何获得所需的结果。

例如,如果查询的第一部分(分组之前)return编辑了这两行...

---------------------------------
HaveCount | WantCount | SaleCount
---------------------------------
1         | 0         | 1
1         | 1         | 0

我现在的查询是 returning...(即只有一行)

1         | 0         | 1

但我希望它 return 从所有行计数...

2         | 1         | 1

我需要对我的查询做些什么才能使其按我需要的方式工作?

注意。尝试仅通过单个数据库查询来执行此操作。

看来您需要将 counts 保存到列表中,然后计算每种类型的计数,如下所示:

var counts = (from a in dc.tblMemberIssues
    join b in dc.vwMembers on a.MemberID equals b.MemberID
    where a.IssueID == issueID).ToList();

var results = new
{
    HaveCount = counts.Count(e => e.HaveCount != 0),
    WantCount = counts.Count(e => e.WantCount != 0),
    SaleCount = counts.Count(e => e.SaleCount != 0)
};

您也可能想要求和:

var results = new
{
    HaveCount = counts.Sum(e => e.HaveCount),
    WantCount = counts.Sum(e => e.WantCount),
    SaleCount = counts.Sum(e => e.SaleCount)
};

即使某些初始计数可能大于 1,如果您只想计算非零的数量,请使用第一个查询,否则,请使用第二个查询。

您不应该对计数中的列进行分组。如果我理解正确的话,你不想对任何东西进行分组,但 Linq 不允许这样,所以将 true 作为分组依据。 (或任何其他常数) 将您的查询更改为:

var counts = (from a in dc.tblMemberIssues
              join b in dc.vwMembers on a.MemberID equals b.MemberID
              where a.IssueID == issueID
              group a by true into d
              select new
              {
                  HaveCount = d.Count(e => e.HaveCount != 0),
                  WantCount = d.Count(e => e.WantCount != 0),
                  SaleCount = d.Count(e => e.SaleCount != 0)
              }).First();