假设您有一个 LINQ 提供程序,它为您提供 IQueryable<Sumbedbes> 或类似名称,那么 - 类似:
var query = from row in source
where row.tafsil > 0
group row by new { row.tafsil, row.SHtafsili, row.SH_projeh }
into grp
where grp.Sum(g => g.bed) > grp.Sum(g => g.bes)
select new
{
grp.Key.tafsil,
grp.Key.SHtafsili,
grp.Key.SH_projeh,
sumbed = grp.Sum(g => g.bed),
sumbes = grp.Sum(g => g.bes),
sumbedbes = grp.Sum(g => g.bed) - grp.Sum(g => g.bes),
sumbesbed = grp.Sum(g => g.bes) - grp.Sum(g => g.bed),
};
您也许可以使用let,但这取决于查询提供者:
var query = from row in source
where row.tafsil > 0
group row by new { row.tafsil, row.SHtafsili, row.SH_projeh }
into grp
let sumbed = grp.Sum(g => g.bed)
let sumbes = grp.Sum(g => g.bes)
where sumbed > sumbes
select new
{
grp.Key.tafsil,
grp.Key.SHtafsili,
grp.Key.SH_projeh,
sumbed,
sumbes,
sumbedbes = sumbed - sumbes,
sumbesbed = sumbes - sumbed,
};
(坦率地说,最后两列完全是多余的)
但是,我不能再强调这一点:我只想使用您已有的 SQL。它是零风险,大大更有效率,而且您无需询问将生成什么查询。使用像“Dapper”这样的工具,只需使用现有的 sql 进行查询是微不足道的:
var data = conn.Query<TheShape>(@"
select tafsil, SHtafsili, SH_projeh, sum(bed) as sumbed, sum(bes) as sumbes,
sum(bed) - sum(bes) as sumbedbes, sum(bes) - sum(bed) as sumbesbed
from SANAD where tafsil > 0
group by tafsil, SHtafsili,SH_projeh
HAVING sum(bed) > sum(bes)").AsList();
其中TheShape 只是一个属性定义与返回数据匹配的类型。