【问题标题】:LINQ : Left Join And Right Join with a double selectionLINQ:左连接和右连接,双重选择
【发布时间】:2019-02-20 14:48:56
【问题描述】:

我正在寻找一种解决方案,在以下 LINQ 查询中包含表 PART 的所有内容(我想是通过添加右/左连接):

var query = (from p in db.PARTS
             join oc in db.OUTPUT_CONTROLS on p.id equals oc.partid
             join f in db.FCT on p.fct equals f.id
             select new
             { p.id, p.plant, p.unit, p.type, p.num, f.name, oc.datetime, oc.ncr } 
             into x
             group x by new 
             { x.id, x.plant, x.unit, x.type, x.num, x.name } 
             into g
             select new 
             { g.Key.id, g.Key.plant, g.Key.unit, g.Key.type, g.Key.num, g.Key.name, startdate = g.Min(oc => oc.datetime), endate = g.Max(oc => oc.datetime), sumncr = g.Sum(oc => oc.ncr) })
             .OrderByDescending(oc => oc.startdate);

谢谢

【问题讨论】:

    标签: c# .net sql-server linq


    【解决方案1】:

    感谢这篇文章,我自己找到了解决方案:LINQ Left Join And Right Join

    解决办法:

    var query = (from p in db.PARTS
                                 join oc in db.OUTPUT_CONTROLS on p.id equals oc.partid into joined
                                 join f in db.FCT on p.fct equals f.id
                                 from j in joined.DefaultIfEmpty()
                                 select new
                                 { p.id, p.plant, p.unit, p.type, p.num, f.name, j.datetime, j.ncr } into x
                                 group x by new { x.id, x.plant, x.unit, x.type, x.num, x.name } into g
                                 select new { g.Key.id, g.Key.plant, g.Key.unit, g.Key.type, g.Key.num, g.Key.name, startdate = g.Min(oc => oc.datetime), endate = g.Max(oc => oc.datetime), sumncr = g.Sum(oc => oc.ncr) })
                                 .OrderByDescending(oc => oc.startdate);
    

    【讨论】:

      【解决方案2】:

      如果您在 SQL 中看到一个联接后跟一个 GroupJoin,请考虑使用 LINQ GroupJoin。

      您经常会在需要“学校与学生”、“客户与他们的订单”、“动物园与他们的动物”的情况下看到这种情况

      您似乎有 3 个表:Parts、OutputControls 和 Fcts。

      每个 Part 都有零个或多个 OutputControl,每个 OutputControl 都只属于一个 Part,使用外键 PartId:简单的一对多关系

      一个Part有一个外键FctId,它指向这个part的Fct。

      您想要部件的(某些属性),以及它们的 OutputControls 和它的 Fct

      var result = parts.GroupJoin(outputControls,   // GroupJoin Parts and OutputControls
          part => part.Id,                           // from every part take the Id
          outputControl => outputControl.PartId,     // from every outputControl take the PartId
      
          // result selector: when these Ids match,
          // use the part and all its matching outputControls to make one new object:
          (part, outputControlsOfThisPart) => new
          {
              // select the part properties you plan to use:
              Id = part.id,
              Plant = part.plant,
              Unit = part.unit
      
              // the output controls of this part:
              OutputControls = outputControlsOfThisPart.Select(outputControl => new
              {
                   // again, select only the output control properties you plan to use
                   Id = outputControl.Id,
                   Name = outputControl.Name,
                   ...
              })
              .ToList(),
      
              // For the Fct, take the Fct with Id equal to Part.FctId
              Fct = Fcts.Where(fct => fct.Id == part.Fct)
                        .Select(fct => new
                        {
                            // select only the Fct properties you plan to use
                            Id = fct.Id,
                            Name = fct.Name,
                            ...
                        })
                        // expect only one such Fct
                        .FirstOrDefault(),
          });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多