2017-08-10 132 views
-1

這是我的查詢返回我準確的結果,我想。我想在LINQ中寫這個。轉換SQL查詢到Linq(需要幫助寫入SQL查詢到LINQ)

select i.reportdate,co.naam,i.issueid,i.vrijetekst,i.lockuser,te.teamnaam, count(ie.issueid) as events, sum(ie.bestedetijd) as Tijd 
      from company co,hoofdcontracten hc,subcontracten sc,sonderhoud so,g2issues i,g2issueevents ie, g2issuestatus iss,teams te,locatie l 
      Where co.companyid = hc.companyid And 
      hc.hcontractid = sc.hcontractid and 
      so.scontractid = sc.scontractid and 
      sc.scontractid = i.scontractid and 
      i.issueid = ie.issueid and 
      so.teamid = te.teamid and 
      ie.locatieid = l.locatieid and 
      l.bezoek = 0 and 
      i.issuestatusid = iss.issuestatusid and 
      fase < 7 and 
      co.companyid <> 165 
      group by i.reportdate,co.naam,i.issueid,i.vrijetekst,i.lockuser,te.teamnaam ,i.reportdate 
      having sum(ie.bestedetijd)>123 

我想這個,但在選擇子句混淆。如何在select子句和group by子句中使用聚合函數。

var myList = (from co in _context.Company 
          from hc in _context.Hoofdcontracten 
          from sc in _context.Subcontracten 
          from so in _context.Sonderhoud 
          from i in _context.G2issues 
          from ie in _context.G2issueEvents 
          from iss in _context.G2issueStatus 
          from te in _context.Teams 
          from l in _context.Locatie 
          where 
          co.CompanyId == hc.CompanyId 
          && hc.HcontractId == sc.HcontractId 
          && so.ScontractId == sc.ScontractId 
          && sc.ScontractId == i.ScontractId 
          && i.IssueId == ie.IssueId 
          && so.Teamid == te.Teamid 
          && ie.LocatieId == l.LocatieId 
          && l.Bezoek == false 
          && i.IssuestatusId == iss.IssueStatusId 
          && iss.Fase < 7 
          && co.CompanyId != 165 
          select new { }).ToList(); 

回答

1

我的!有人試圖用各種難以辨認的變量名稱來保存幾分鐘的時間,比如hc,sc,所以我就是這樣,而不用擔心這會花費時間來理解發生的事情。

我還沒有試圖完全解讀你的查詢,顯然你認爲它不需要顯示你的實體框架類和它們之間的關係。

我收集的是你想要執行一個大連接,然後從連接中選擇幾個列。您想要將結果集合分組爲具有相同報告日期,名稱,issueid,...的項目組。您希望每個組中的所有項目都具有相同的項目,並且您希望組中的項目數量爲

LINQ有兩種類型的語法,實際上也是這樣:Query syntax and Method syntax。儘管我可以閱讀查詢語法,但我更熟悉方法語法,所以我的答案將使用方法語法。我想你會明白髮生了什麼事。

我會在更小的步驟中完成它,如果需要,可以將所有步驟連接成一個。

首先你做一個大連接,之後你選擇一些列。一個大的聯接是寫在查詢語法時更容易爲數不多的語句之一(見SO: LINQ method syntax for multiple left join

var bigJoin = from hc in _context.Hoofdcontracten 
       from sc in _context.Subcontracten 
       from so in _context.Sonderhoud 
       ... 
       from l in _context.Locatie 
       where 
       co.CompanyId == hc.CompanyId 
       && hc.HcontractId == sc.HcontractId 
       ... 
       && iss.Fase < 7 
       && co.CompanyId != 165 
       select new 
       { 
        hc, 
        sc, 
        so, 
        ... // etc select only items you'll use to create your end result 
       }; 

現在你已經有了一個大表的連接效果。你想這個表劃分爲具有相同值的組進行

{ 
    i.reportdate, 
    co.naam, 
    i.issueid, 
    i.vrijetekst, 
    i.lockuser, 
    te.teamnaam, 
} 

(順便說一句:你在的GroupBy提到reportdate兩次,我想這不是你的意思)

這種分組使用完成Enumerable.GroupBy

var groups = bigjoin.GroupBy(joinedItem => new 
    { // the items to group on: all elements in the group have the same values 
     ReportDate = i.Reportdate, 
     CompanyName = co.naam, 
     IssueId = i.issueid, 
     FreeText = i.vrijetekst, 
     LockUser = i.lockuser, 
     TeamName = te.teamnaam, 
    }); 

結果是組的集合。每個組都包含具有相同的價值爲ReportDate,公司名稱等原bigJoin項目共同價值觀是group.Key

現在從您希望的下列項目各組:

  • 幾個組中的常見值(ReportDate,CompanyName,IssueId,...)。我們從組的密鑰中得到它們
  • Tijd =組中所有元素的ie.bestedeTijd的總和
  • Events =是組中所有元素的ie.IssueId的數量。由於組中的每個元素只有一個ie.IssueId,因此結果也是組中元素的數量。

從這個結果,你只希望保留那些具有Tijd> 123

所以我們會做一個新的選擇的組,然後在Tijd

var result = groups.Select(group => new 
{ 
    Tijd = group.Sum(groupElement => groupElement.ie.bestedetijd), 
    Events = group.Count(), 

    // the other fields can be taken from the key 
    ReportDate = group.Key.reportdate, 
    CompanyName = group.Key.CompanyName, 
    IssueId = group.Key.Issueid, 
    FreeText = group.Key.FreeText, 
    LockUser = group.Key.LockUser, 
    TeamName = group.Key.TeamName, 
}) 
.Where(resultItem => resultItem.Tijd > 123); 
一凡