林克通过分组错误的结果集进行分组
本文关键字:结果 错误 林克 | 更新日期: 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();
我希望我已经正确地理解了这一点!