林克通过分组错误的结果集进行分组

本文关键字:结果 错误 林克 | 更新日期: 2023-09-27 18:21:20

开发人员

我从来没有遇到过比这更接近的问题,在两次世界大战期间也没有找到任何答案。。。

我有一个简单的查询:

var data = (from b in db.vw_SpedF500
                    where b.DATABAIXA >= dtInicial && b.DATABAIXA <= dtFinal
                    where b.CODCOLIGADA == codcoligada
                    select b).ToList();

对于我使用的情况,视图精确地返回441个结果。我需要按名为CSTPIS的列对它们进行分组,该列可以有三个不同的值(字符串):01、06或08。

我期望的结果计数是:

  • 01=>170个结果
  • 06=>143个结果
  • 08=>128个结果

分组后的结果计数:

  • 01=>170个结果
  • 06=>172个结果
  • 08=>109个结果

这是我的查询组:

b.LinhasF500 = (from d in grupo
                                group d by d.CSTPIS into g
                                select new F500()
                                {
                                    VL_REC_CAIXA = g.Sum(f => f.VALOR.Value).ToString("F2"),
                                    CST_COFINS = g.FirstOrDefault().CSTCOFINS,
                                    VL_BC_COFINS = g.FirstOrDefault().CSTCOFINS == "08" ? null : g.Sum(f => f.VALOR.Value).ToString("F2"),
                                    ALIQ_COFINS = g.FirstOrDefault().CSTCOFINS == "08" ? null : g.FirstOrDefault().ALIQUOTACOFINS.Value.ToString("F2"),
                                    VL_COFINS = g.FirstOrDefault().CSTCOFINS == "08" ? null : g.Sum(f => f.COFINSBAIXA.Value).ToString("F2"),
                                    CST_PIS = g.FirstOrDefault().CSTPIS,
                                    ALIQ_PIS = g.FirstOrDefault().CSTPIS == "08" ? null : g.FirstOrDefault().ALIQUOTAPIS.Value.ToString("F2"),
                                    VL_PIS = g.FirstOrDefault().CSTPIS == "08" ? null : g.Sum(f => f.PISBAIXA.Value).ToString("F2"),
                                    VL_BC_PIS = g.FirstOrDefault().CSTPIS == "08" ? null : g.Sum(f => f.VALOR.Value).ToString("F2")
                                }).ToList();

林究竟为什么会重复10个结果?

PS:直接在sql查询上分组工作正常

编辑

在查看Ivan的评论后,我注意到以下内容:

EF使用三列为我的视图确定了一个复合键:IDLAN、CODCFO和CODCOLIGADA。

运行此查询之后

select IDLAN, CODCFO, CODCOLIGADA, COUNT(IDLAN), COUNT(CODCFO), COUNT(CODCOLIGADA) from vw_SpedF500
where 0=0
    AND DATABAIXA BETWEEN '2015-08-01' AND '2015-08-31'
    and CODCOLIGADA = 7
GROUP BY IDLAN, CODCFO, CODCOLIGADA
HAVING COUNT(IDLAN) > 1 AND COUNT(CODCFO) > 1 AND COUNT(CODCOLIGADA) > 1
ORDER BY IDLAN

我得到124行,其中所有三个键都有一个以上的寄存器。

我有什么办法可以在EF上做到这一点吗?

编辑

我再次检查了所有内容。第一个查询返回正确的结果,并且对象已在内存中。

当对已经在内存中的对象进行分组时,而不是在查询过程中,就会出现问题。这与EF无关。

我想我会把它改成SqlCommand(这会导致一个小的性能问题,因为我必须运行这个查询三次,但是…)

林克通过分组错误的结果集进行分组

看起来您的LINQ查询可能限制性太强了——这已经让我陷入了困境。使用限制较少的筛选器,删除第二个where关键字,并将最后一句与第一句合并。

像这样的东西应该会给你想要的:

var data = (from b in db.vw_SpedF500
            where b.DATABAIXA >= dtInicial &&
                  b.DATABAIXA <= dtFinal &&
                  b.CODCOLIGADA == codcoligada
            select b).ToList();

如果您试图确保您的LINQ查询只返回与以下内容匹配的结果:

b.DATABAIXA >= dtInicial && b.DATABAIXA <= dtFinal

ORthis(与this相反)

b.CODCOLIGADA == codcoligada

你可以试试这个:

var data = (from b in db.vw_SpedF500
            where (b.DATABAIXA >= dtInicial &&
                   b.DATABAIXA <= dtFinal) ||
                   b.CODCOLIGADA == codcoligada
            select b).ToList();

我希望我已经正确地理解了这一点!