2017-10-23 10 views
1

私はできるだけ明確にします。 私の最初のテーブルにはタイプののジョブが含まれています。複数のテーブル間でリレーショナルLINQクエリを作成する

public class JobTypes: Entity 
    { 
     public string Code { get; set; } 
    } 

ここには2番目のエンティティにすべてのジョブが含まれています。

public class FinishedWork: Entity 
    { 
     public string JobTypeCode { get; set; } 
     public int DepartmentId { get; set; } 
     public int EmployeeId { get; set; } 
    } 

と従業員と部門:

public class Employee: Entity 
    { 
     public string Name { get; set; } 
    } 
public class Department: Entity 
    { 
     public string DepartmentName { get; set; } 
    } 

クエリ結果は答える必要があります。 「各従業員の各ジョブ・タイプに完成した作品の数」 はたとえば、結果は次のようになります。

Employee JobType1 JobType2 ... JobType122 DepartmentName (Yes, there is 122 job type and result should tell how many work done by alice each job) 
Alice 2   0  ... 0,   AccountManagement 
... 

し、それを達成するために、私のクエリ。

var mdl = (from m in FinishedWork 
          join t in JobTypes m.JobTypeCode equals t.Code 
          join d in Department on m.DepartmentId equals d.ID 
          join e in Employee on m.EmployeeId equals e.ID 
          group m by new { e.ID, e.Name, m.JobTypeCode } into grp 
          select new ResultModel 
          { 
          ... 

私はこの結果をモデルに、各ジョブの種類の数を取得できますか、ここで適切な解決策を見つけるcouldntの?あなたが欲しい

+0

なぜEFでリレーションシップを使用していないのですが、このシームは単純な列テーブルのマッピングですか? –

+0

'FinishedWork'エンティティに完全なコードを保存すると、あなたの' JobTypes'エンティティのポイントは何ですか? – Rafalon

+0

@FilipCordas私はあなたが何を意味しているのか理解しましたが、切り替え前に私のロジックが質問に集中できるようにしてください。 – TyForHelpDude

答えて

2

を望んでいたものを返すようにピボット拡張機能を使用してピボット、名前とジョブタイプ によってグループでクエリを実行し、ナビゲーションプロパティを使用することができますお使いのモデルではなく、あなたのクエリを向上させることができます。

var query =context.FinishedWork.GroupBy(fw=>new{fw.Employee.Name,fw.Department.DepartmentName}) 
           .Select(g=>g.GroupBy(fw=>fw.JobTypeCode) 
              .Select(g1=>new {g.Key.Name, 
                  g.Key.DepartmentName, 
                  g1.Key, 
                  g1.Count()})); 

問題は、私は初めからグループの量を知らなくても(ジョブの種類を表す)の各内側のグループのための匿名型のフィールドを追加する方法がわからないです、何かをする以下のような:私はあなただった場合

var query =context.FinishedWork.GroupBy(fw=>new{fw.Employee.Name,fw.Department.DepartmentName}) 
           .Select(g=>new {g.Key.Name, 
               g.Key.DepartmentName, 
               JobType1=g.Count(fw=>fw.JobTypeCode==code1), 
               JobType2=g.Count(fw=>fw.JobTypeCode==code2), 
               ... 
               }); 

そして、私はあなたがそれを行うにはしたくないと思いますが、私は最初のソリューションを使用するか、私はうまくいけば存在することを期待している別のものより良いです。

関連する問題