как преобразовать ado. net в лямбда - PullRequest
1 голос
/ 06 мая 2020
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)

Я хочу преобразовать этот код из ado. net в лямбда. Спасибо за помощь

1 Ответ

0 голосов
/ 06 мая 2020

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

...