【问题标题】:how to convert ado.net to lambda如何将 ado.net 转换为 lambda
【发布时间】:2020-08-21 00:38:49
【问题描述】:
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 转换为 lambda。谢谢你的帮助

【问题讨论】:

  • 首先,这不是一个 lambda - 它是一个 LINQ 查询表达式(涉及多个 lambda),但是 - 问题:为什么你想要完美工作,直接 SQL 代码,并添加多个级别的间接和抽象(以及错误空间)?
  • and and group by ???
  • 我应该如何指导?

标签: c# asp.net entity-framework lambda ado.net


【解决方案1】:

假设您有一个 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 只是一个属性定义与返回数据匹配的类型。

【讨论】:

  • 再次抱歉。但我在使用代码时遇到问题 public IQueryable Select() { try { var query =from.... return query } catch { return null; } } 并且它不能是返回查询。并显示此错误:无法隐式转换类型'System.Linq.IQueryable>' 到 'System.Linq.IQueryable'
  • public IQueryable Select() { try { var query = from ... return query } catch { return null; } } 抱歉,不能返回查询
  • @حسpetit >
猜你喜欢
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
  • 2013-04-18
  • 2020-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多