【问题标题】:Linq query with left join and group具有左连接和组的 Linq 查询
【发布时间】:2009-07-20 14:40:28
【问题描述】:

我无法将此 SQL 查询转换为有效的 linq 语句

select sum(cena), id_auta, max(servis) from dt_poruchy left outer join mt_auta on dt_poruchy.id_auta=mt_auta.id
where dt_poruchy.servis>=3 group by id_auta;

我尝试过这样的事情,但我无法处理 select 语句

   var auta = from a in MtAuta.FindAll()
                   join p in DtPoruchy.FindAll() on a equals p.MtAuta into ap
                   from ap2 in ap.DefaultIfEmpty()
                   where ap2.SERVIS >= 3
                   group ap2 by ap2.ID into grouped
                   select new {

我将不胜感激!

【问题讨论】:

    标签: c# sql linq linq-to-nhibernate


    【解决方案1】:

    根据提供的有限信息(某些字段来自哪些表?),这就是我想出的。

    var auta = from a in MtAuta.FindAll()
               let p = a.DtPoruchys.Where(s => s.SERVIS >= 3)
               select new
               {
                   Id = a.Id,
                   CenaSum = p.Sum(c => c.Cena),
                   Servis = p.Max(s => s.SERVIS)
               };
    

    【讨论】:

    • 如果我做了任何不正确的假设,请告诉我,我会确保更新我的答案!
    • 很抱歉我的定义不完整。 MtAuta 是主表(包含 DtPoruchy),DtPoruchy 是从表,包含 CENA、SERVIS 和 ID_AUTA 字段。
    • 除了我的答案中的大写,这对你有用吗?您是否在使用 LinqToSql,如果是,您的关系是否设置正确?看起来是这样,因为您的问题中有p.MtAuta,但最好确认一下。
    • 实际上我使用的不是 Linq to SQL,而是 Linq to NHibernate。你的回答对我不起作用。 DtPoruchy 类引用了 MtAuto。 p.MtAuta 的说法是正确的。
    • 我想可能存在一个更简单的解决方案(类似于我的),但我还没有玩过 Linq to NHibernate,所以我不知道它是什么:(
    【解决方案2】:

    我已经达到了这个解决方案(假设“cena”属于MtAuta.FindAll()):

            var auta = from e in
                           (from a in DtPoruchy.FindAll()
                            where a.SERVIS >= 3
                            join p in MtAuta.FindAll() on a.MtAuta equals p.Id into ap
                            from ap2 in ap.DefaultIfEmpty()
                            select new
                            {
                                Cena = ap.cena,
                                IdAuta = a.MtAuta,
                                Servis = a.servis
                            })
                       group e by e.IdAuta into g
                       select new
                       {
                           Cena = g.Sum(e => e.cena),
                           IdAuta = g.Key,
                           Servis = g.Max(e => e.servis)
                       };
    

    【讨论】:

      【解决方案3】:

      我不确定 cena 和 servis 来自哪个表,但要创建分组总和,您可以执行类似的操作。

      select new { Sum = grouped.Sum( x => x.cena ) }
      

      并获得最大值

      select new { Max = grouped.Group.Max( x => x.servis ) }
      

      这是一个很好的参考。

      【讨论】:

        【解决方案4】:

        我已经稍微修改了您的解决方案,我得到了它的工作方式:

        var auta = from jo in
                               (
                                   from a in MtAuta.FindAll()
                                   join p in DtPoruchy.FindAll() on a equals p.MtAuta into ap
                                   from ap2 in ap.DefaultIfEmpty()
                                   where ap2.SERVIS >= 3
                                   select new
                                   {
                                       Cena = ap2.CENA,
                                       Idauto = ap2.ID_AUTA,
                                       Servis = ap2.SERVIS
                                   }
                               )
                           group jo by jo.Idauto into g
                           select new
                           {
                               Cena = g.Sum(jo => jo.Cena),
                               IdAuto = g.Key,
                               Servis = g.Max(jo => jo.Servis)
                           };
        

        我只是好奇这是否是最好的解决方案?

        【讨论】:

        • 您不太可能需要远程这么复杂的东西。查看 Ryan 的回答。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 2015-02-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多