含JOIN、GROUP BY、SUM的SQL转LINQ技术求助
解决SQL转LINQ的问题:计算分组后的IVA值
我来帮你搞定这个LINQ转换的问题!首先先回顾你给出的原始SQL语句,它的作用是按id_iva分组,计算每组销售行总额乘以对应税率百分比再除以100的IVA值:
SELECT (SUM(L.total_linea) * I.porcentaje / 100) AS iva FROM linea_ventas L JOIN iva I ON L.id_iva = I.id_iva GROUP BY L.id_iva
你之前写的LINQ已经完成了join和分组的基础部分,但问题在于分组后没有保留对应的税率(porcentaje)信息,所以没办法完成最终的IVA计算。这里给你两种可行的正确写法:
写法一:分组时同时携带关联的IVA数据
把销售行和对应的IVA对象一起分组,这样分组后就能从集合中拿到税率值(因为同一个id_iva对应的税率肯定一致,用First()获取完全安全):
from l in linea_ventas join i in ivas on l.id_iva equals i.id_iva group new { Linea = l, Iva = i } by l.id_iva into groupedData select new { IdIva = groupedData.Key, IvaCalculado = (groupedData.Sum(item => item.Linea.total_linea) * groupedData.First().Iva.porcentaje) / 100.0 }
写法二:将税率纳入分组键
因为同一个id_iva对应的porcentaje是唯一的,所以可以直接把id_iva和porcentaje一起作为分组键,这样在select时直接通过分组键获取税率即可:
from l in linea_ventas join i in ivas on l.id_iva equals i.id_iva group l by new { l.id_iva, i.porcentaje } into groupedData select new { IdIva = groupedData.Key.id_iva, IvaCalculado = (groupedData.Sum(item => item.total_linea) * groupedData.Key.porcentaje) / 100.0 }
两种写法都能完美还原原始SQL的逻辑,你可以根据自己的习惯选择其中一种,直接在LINQPad 5里测试就能得到正确结果啦!
内容的提问来源于stack exchange,提问作者user9784880
相关产品推荐
相关产品推荐

