2016-09-29 65 views
0

请帮助我实现包含加入和条件COUNT和SUM Linq中的这个SQL查询:LINQ的加入和聚合

SELECT 
      COUNT(distinct Spool.ISODwg+'-'+Spool.SpoolNo) as All_Spool, 
      SUM(case when (JointFMC.SBNM='AG' and JointFMC.SF='S') then JointFMC.Size else 0 end) as All_DI, 
      COUNT(distinct case when (Spool.ReleaseNo is not null and Spool.ReleaseNo!='') then Spool.ISODwg+'-'+Spool.SpoolNo else null end) as Release_Spool, 
      SUM(case when (Spool.ReleaseNo is not null and Spool.ReleaseNo!='') and (JointFMC.SBNM='AG' and JointFMC.SF='S') then JointFMC.Size else 0 end) as Release_DI, 
      COUNT(distinct case when (JointFMC.RT_Status='Result Needed' or JointFMC.RT_Status='App. Needed') and (JointFMC.SBNM='AG' and JointFMC.SF='S') then Spool.ISODwg+'-'+Spool.SpoolNo else null end) as BL_Spool, 
      SUM(case when (JointFMC.RT_Status='Result Needed' or JointFMC.RT_Status='App. Needed') and (JointFMC.SBNM='AG' and JointFMC.SF='S') then JointFMC.Size else 0 end) as BL_DI 

    FROM Spool LEFT JOIN JointFMC ON (Spool.ISODwg = JointFMC.ISODwg and Spool.SpoolNo = JointFMC.SpoolNo) 

卷轴类(部分)

public class Spool : ModelBase 
{ 
    #region Properties------------------------------------------------------------------------------- 
    //ISODwgNo 
    private string _iSODwgNo; 
    public string ISODwgNo 
    { 
     get { return _iSODwgNo; } 
     set 
     { 
      if (_iSODwgNo != value) 
      { 
       _iSODwgNo = value; 
       ValidateProperty("ISODwgNo", value); 
       OnPropertyChanged("ISODwgNo"); 
      } 
     } 
    } 

    //ISODwg 
    private string _iSODwg; 
    public string ISODwg 
    { 
     get { return _iSODwg; } 
     set 
     { 
      if (_iSODwg != value) 
      { 
       _iSODwg = value; 
       ValidateProperty("ISODwg", value); 
       OnPropertyChanged("ISODwg"); 
      } 
     } 
    } 

    //SpoolNo 
    private string _spoolNo; 
    public string SpoolNo 
    { 
     get { return _spoolNo; } 
     set 
     { 
      if (_spoolNo != value) 
      { 
       _spoolNo = value; 
       ValidateProperty("SpoolNo", value); 
       OnPropertyChanged("SpoolNo"); 
      } 
     } 
    } 


    //Type 
    private string _type; 
    public string Type 
    { 
     get { return _type; } 
     set 
     { 
      if (_type != value) 
      { 
       _type = value; 
       ValidateProperty("Type", value); 
       OnPropertyChanged("Type"); 
      } 
     } 
    } 


    //Area 
    private string _area; 
    public string Area 
    { 
     get { return _area; } 
     set 
     { 
      if (_area != value) 
      { 
       _area = value; 
       ValidateProperty("Area", value); 
       OnPropertyChanged("Area"); 
      } 
     } 
    } 
} 

JointFMC类(部分)

public class JointFMC : ModelBase 
{ 
    #region Properties------------------------------------------------------ 
    //SBNM 
    private string _sBNM; 
    public string SBNM 
    { 
     get { return _sBNM; } 
     set 
     { 
      if (_sBNM != value) 
      { 
       _sBNM = value; 
       ValidateProperty("SBNM", value); 
       OnPropertyChanged("SBNM"); 
      } 
     } 
    } 


    //ISODwg 
    private string _iSODwg; 
    public string ISODwg 
    { 
     get { return _iSODwg; } 
     set 
     { 
      if (_iSODwg != value) 
      { 
       _iSODwg = value; 
       ValidateProperty("ISODwg", value); 
       OnPropertyChanged("ISODwg"); 
      } 
     } 
    } 


    //JointNo 
    private string _jointNo; 
    public string JointNo 
    { 
     get { return _jointNo; } 
     set 
     { 
      if (_jointNo != value) 
      { 
       _jointNo = value; 
       ValidateProperty("JointNo", value); 
       OnPropertyChanged("JointNo"); 
      } 
     } 
    } 



    //SpoolNo 
    private string _spoolNo; 
    public string SpoolNo 
    { 
     get { return _spoolNo; } 
     set 
     { 
      if (_spoolNo != value) 
      { 
       _spoolNo = value; 
       ValidateProperty("SpoolNo", value); 
       OnPropertyChanged("SpoolNo"); 
      } 
     } 
    } 


    //Size 
    private double? _size; 
    public double? Size 
    { 
     get { return _size; } 
     set 
     { 
      if (_size != value) 
      { 
       _size = value; 
       ValidateProperty("Size", value); 
       OnPropertyChanged("Size"); 
      } 
     } 
    } 


    //SF 
    private string _sF; 
    public string SF 
    { 
     get { return _sF; } 
     set 
     { 
      if (_sF != value) 
      { 
       _sF = value; 
       ValidateProperty("SF", value); 
       OnPropertyChanged("SF"); 
      } 
     } 
    } 


    //WeldRpNo 
    private string _weldRpNo; 
    public string WeldRpNo 
    { 
     get { return _weldRpNo; } 
     set 
     { 
      if (_weldRpNo != value) 
      { 
       _weldRpNo = value; 
       ValidateProperty("WeldRpNo", value); 
       OnPropertyChanged("WeldRpNo"); 
      } 
     } 
    } 


    //RT_Status 
    private string _rT_Status; 
    public string RT_Status 
    { 
     get { return _rT_Status; } 
     set 
     { 
      if (_rT_Status != value) 
      { 
       _rT_Status = value; 
       ValidateProperty("RT_Status", value); 
       OnPropertyChanged("RT_Status"); 
      } 
     } 
    } 


    #endregion 

} 

关注

+0

下面是如何在一个查询中执行此操作的示例: http://stackoverflow.com/questions/1597181/linq-to-sql-how-to-aggregate-without-a-group-by –

+0

Show我们到目前为止你已经尝试过 – user449689

+0

@ user449689:我尝试了很多没有用处的想法,最后我会尝试的是让2个查询第一个用于分组,第二个用于分组,第二个用于最终结果 – Hussein

回答

2

这里是直接LINQ翻译:

var query = 
    from Spool in db.Spool 
    join JointFMC in db.JointFMC 
    on new { Spool.ISODwg, Spool.SpoolNo } 
    equals new { JointFMC.ISODwg, JointFMC.SpoolNo } into JointFMCJoin 
    from JointFMC in JointFMCJoin.DefaultIfEmpty() 
    group new { Spool, JointFMC } by 1 into g 
    select new 
    { 
     All_Spool = g 
      .Select(e => e.Spool.ISODwg + "-" + e.Spool.SpoolNo).Distinct().Count(), 
     All_DI = g.Sum(e => e.JointFMC.SBNM == "AG" && e.JointFMC.SF == "S" ? 
      e.JointFMC.Size : 0), 
     Release_Spool = g.Where(e => !string.IsNullOrEmpty(e.Spool.ReleaseNo)) 
      .Select(e => e.Spool.ISODwg + "-" + e.Spool.SpoolNo).Distinct().Count(), 
     Release_DI = g.Sum(e => !string.IsNullOrEmpty(e.Spool.ReleaseNo) && e.JointFMC.SBNM == "AG" && e.JointFMC.SF == "S" ? 
      e.JointFMC.Size : 0), 
     BL_Spool = g.Where(e => (e.JointFMC.RT_Status == "Result Needed" || e.JointFMC.RT_Status == "App. Needed") && e.JointFMC.SBNM == "AG" && e.JointFMC.SF == "S") 
      .Select(e => e.Spool.ISODwg + "-" + e.Spool.SpoolNo).Distinct().Count(), 
     BL_DI = g.Sum(e => (e.JointFMC.RT_Status == "Result Needed" || e.JointFMC.RT_Status == "App. Needed") && e.JointFMC.SBNM == "AG" && e.JointFMC.SF == "S" ? 
      e.JointFMC.Size : 0), 
    }; 

注意,LINQ不具有SQL COUNT(DISTINCT ..)构建良好相等的,所以从上面的LINQ查询生成的SQL查询将更加复杂(也可能较慢)比原来的。在这种情况下,如果ORM工具支持,则最好不要使用LINQ并执行原始SQL查询。