2009-08-11 7 views
1

私は3つのテーブルを含むSampleDBを持っています。多対多の関係を扱うためにEntity Frameworkを使用するにはどうすればよいですか?

Table Employees (EmployeeID, EmployeeName) 
Table Projects (ProjectID, ProjectName) 
Table ProjectResources (ProjectID, EmployeeID) 

ProjectResourcesテーブルは、従業員とプロジェクトとの間の多対多の関係を作成クロスリファレンステーブルです。

LINQを使用して、特定のプロジェクトにまだ割り当てられていないすべての従業員を選択したいと考えています。

  1. 上記のSampleDBからエンティティフレームワークウィザードを使用してエンティティデータモデルを作成しました。ウィザードでは、従業員とプロジェクトという2つのエンティティが作成されます。従業員とプロジェクトは、従業員とプロジェクトに名前を変更しました。プロジェクトエンティティには従業員コレクションを参照する従業員ナビゲーションプロパティがあり、従業員エンティティにはプロジェクトコレクションを参照するプロジェクトナビゲーションプロパティがあります。 EFが従業員とプロジェクトの表の多対多の関係を正しく識別したかのように見えます。

  2. ここでは、まだプロジェクトに割り当てられていないすべての従業員を選択するために使用したコードを示します。現在

    その後、私はしようとしたとき、私は次の例外を取得し、そのプロジェクトに割り当てられた従業員のリストと罰金1つの のvar currentEmployees負荷のPROJECTIDを持っているプロジェクトの微細

    SampleDBEntities db = new SampleDBEntities(); 
        var project = db.Projects.Include("Employees") 
              .FirstOrDefault(p => p.ProjectID == 1); 
        var currentEmployees = project.Employees; 
        var employeesNotAssignedToProject = 
          db.Employees.Except(currentEmployees); 
    

VARプロジェクトのロードウォッチウィンドウでresultsviewのofemployeesNotAssignedToProjectを見て:

{ "タイプの定数値『System.Collections.Generic.IEnumerable`1』を作成することができません。 ( 'などのInt32、文字列、およびGUIDなど') のみプリミティブ型は、このコンテキストでサポートされている "}

だから、質問は以下の通りです。

  1. は、なぜ私はこの例外を取得しています
  2. ? ?。このタイプのタスクを達成しようとする(働く)別の方法があり、私はこの方法がおそらくより良い方法がある「を除き、」使用しようとしていますことに注意してくださいこれは何について
+0

私の質問のフォーマットについては申し訳ありません。私はそう新しいです。より適切に質問を書式化しようとします。 – jsteele

+0

これはより良いと思います。 :) –

+0

ニース!クレイグを助けてくれてありがとう。 – jsteele

答えて

2

var employeesNotAssignedToProject = db.Employees.Select(e => e).Where(e => (e.Projects.Count(c => c.ProjectID == 1)) == 0) 

私はこれをテストしていませんが、基本的には、プロジェクトのコレクションに問題のプロジェクトが含まれていない従業員のみを選択します。

+0

それは動作します。ありがとう。 – jsteele

+2

!Any()はCount()== 0より効率的です。 –

+0

上記の例でどのように見えますか? –

関連する問題