0

TPM_TASKSすべてのタスクを含む というテーブルと、すべてTPM_USERのユーザーを含む というテーブルがあります。次に、1 人のユーザーへの 1 つのタスクの割り当てを格納するをTPM_USERTASKS含む という名前のテーブルがあります。UserIdTaskId

TPM_USER特定のエンティティに割り当てられているすべてのタスクを選択しようとしています。これまでのところ、私は試しました:

TPM_USER user = UserManager.GetUser(context, UserId); //Lookup the user in the DB
var tasks = (from t in context.TPM_TASK.Include("TPM_USER")
             where t.TPM_USER.Contains<TPM_USER>(user)
             select t);

ただし、これを反復しようとすると、実行時例外が発生します。

タイプ 'Entity.TPM_USER' の定数値を作成できません。このコンテキストでは、プリミティブ型 (Int32、String、および Guid など) のみがサポートされます。

TPM_USER オブジェクトを に渡すのは好きではないと思いますContains()。これはおそらく、節ではなくネストされた SELECT ステートメントを生成する必要があるため、理にかなっていますがIN、これはおそらく EF では実行できません。しかし、確かにこのようなクエリを実行する方法がありますよね?

注:頭のいい人なら、なぜクエリTPM_USERTASKSを実行してからマッチングに参加しないのかと疑問に思うかもしれませんTPM_TASK。ええと、私はこれをやりたいです。ただし、私は午前中ずっと EF に TPM_USERTASK モデルを生成させようとしてきましたが、そうはなりません。テーブルがモデル ストアに表示され、それに対してリレーションシップを定義できます。データベースから追​​加または更新できるエンティティのリストに表示されず、.EDMX ファイル全体を削除して再度作成しようとしました。多対多の関係で使用されるものは、スタンドアロンのエンティティにもならないのでしょうか?

4

2 に答える 2

2

さて、ナビゲーション プロパティを使用する必要があります。

多対多の関係では、これは、

public virtual ICollection<TPM_USER> TpmUsers {get;set;}

TPM_TASK クラスで

および/または

public virtual ICollection<TPM_TASK> TpmTasks{get;set;}

あなたの TMP_USER クラスで。

そうしないと、2 つのエンティティを結合するクエリを作成できません。

これで、クエリを次のように書くことができます

var userTasks = context.TPM_TASK
                   .Where(task => task.TpmUsers
                         .Any(user => user.Id == UserId));
于 2012-06-18T18:34:03.017 に答える