2017-08-10 9 views
-1

これは私のクエリから私が欲しい正確な結果を返します。私はLINQでこれを書いています。SQLクエリをLinqに変換する(linqにSQLクエリを書くのに助けが必要です)

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節で混乱しています。どのように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、i、ie、issのようなすべての種類の解読不可能な変数名を使用して、何が起こるのかを理解するのに必要な時間が10倍になることを迷わずに、数分の時間を節約しようとしていました。

私はあなたのクエリを完全に解読しようとはしていませんでした。明らかに、エンティティフレームワーククラスとそれらの間の関係を表示する必要はないと思ったようです。

私が集めるのは、大きな結合を実行してから、結合からいくつかの列を選択するということです。結果のコレクションを、同じreportdate、name、issueidなどの項目のグループにグループ化したいとします。グループ内のすべてのアイテムに対してbestede tijdを実行したい場合は、グループ内のアイテム数を指定します。

LINQには実際には同じ2種類の構文があります:Query syntax and Method syntax。私はクエリの構文を読むことができますが、私はもっとメソッドの構文に精通しているので、私の答えはメソッドの構文を使用します。私はあなたが何が起こるかを理解するだろうと思う。

小さなステップでやってみましょう。必要に応じてすべてのステップを1つに連結できます。

まず大きな結合を行い、その後でいくつかの列を選択します。ビッグは参加する今、あなたは参加する結果と大きなテーブルを持っている

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 
       }; 

SO: LINQ method syntax for multiple left joinを参照)クエリ構文で記述されたときに簡単で、いくつかの文の一つです。あなたは

{ 
    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、会社名、用のためにこの共通の値では、以下の項目をしたいすべてのグループから今group.Key

    にある同じ値を持つ元bigJoin項目が含まれていますグループ(ReportDate、CompanyName、IssueId、...)の共通の値グループのキーから取得します

  • Tijd =グループ内のすべての要素のie.bestedeTijdの合計
  • イベント=は、グループ内のすべての要素のie.IssueIdの数です。グループ内のすべての要素はie.IssueIdを1つしか持たないため、結果はグループ内の要素の数にもなります。

この結果から、あなただけの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); 
上のどこに続いて、だから我々はグループで選択した新しい操作を行います> 123

Tijd紙を有するものを維持したいです

関連する問題