Предполагая, что у вас есть поставщик 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
- это просто тип с соответствующими определениями свойств для возвращаемых данных.