2016-09-13 5 views
1

私は以下のデータベースを持っています。企業のリスト。各社には複数の従業員と複数の請負業者がいます。LINQ集合テーブル複数

dbo.Companies (CompanyId, Name) 
dbo.Employees (Id, CompanyId, Name ...) 
dbo.Contractors(Id, CompanyId, Name...) 

私は従業員を取得するために請負業者と1を取得するには2つのクエリ、いずれかの操作を実行し、それらをマージしないようにしようとしていますので、

CompanyName #Employees #Contractors 
abc   0    10 
xyz   25   999 

のような出力を取得したいです。一度にやり遂げる方法はありますか?

n.b.私は

class CompanySummary{ 
string Name {get; set;} 
int EmpCount {get; set;} 
int ConCount {get; set;} 
} 

を持っているあなたはナビゲーションプロパティを定義している(とあなたがいない場合、それはそれを行うには良い時間だ可能性がある)場合ので、私は結果

+0

なぜこのために参加しないのですか? –

答えて

2

として、このタイプのコレクションを使用することができます、クエリは非常に簡単でなければなりません。もちろん

var query = from c in db.Companies 
      select new CompanySummary 
      { 
       Name = c.Name, 
       EmpCount = c.Employees.Count(), 
       ConCount = c.Contractors.Count(), 
      }; 

は手動でそれを行うことができますが、上記のEFで好ましい方法である:

var query = from c in db.Companies 
      select new CompanySummary 
      { 
       Name = c.Name, 
       EmpCount = db.Employees.Count(e => e.CompanyId == c.Id), 
       ConCount = db.Contractors.Count(cc => cc.CompanyId == c.Id), 
      }; 

どちらの場合でも、単一のSQLクエリが得られます。

0

エンティティフレームワークを使用してデータベースと通信し、テーブルを外部キーにリンクさせる場合は、おそらく1つのクエリで実行できます。これは次のようになります:

IEnumerable<CompanySummary> companySummary = null; 

using (CompanyEntities dbContext = new CompanyEntities()) 
{ 
    companySummary = dbContext.Companies 
     .Include(company => company.Employees) 
     .Include(company => company.Contractors) 
     .Select(company => new CompanySummary 
     { 
      Name = company.Name, 
      EmpCount = company.Employees.Count(), 
      ConCount = company.Contractors.Count() 
     }); 
} 
関連する問題