3

モデル:

 public class User
 {
     [Key]
     public int UserId { get; set; }
     public string UserName { get; set; }
 }

public class Resource
{
    [Key]
    public int ResourceId { get; set; }
    public string ResourceName { get; set; }
    public string  ResourceDescription { get; set; }
}

public class UserResource
{
    [Key, Column(Order=0)]
    public int UserId { get; set; }
    [Key, Column(Order=1)]
    public int ResourceId { get; set; }
    public int ResourceQuantity { get; set; }
}

特定の「UserId」に対して、Resource モデルから「ResourceName」を選択し、UserResource モデルから「ResourceQuantity」を選択したいと考えています。また、選択した後、指定された 2 つの列のみを搭載するには、新しいモデルが必要ですか?

また、UserResource モデルには複合キーがあることに注意してください。そのため、結合の方法について混乱しています...これは正しいですか?

 var userResources =
          from r in imDB.Resources
          join ur in imDB.UserResources
          on r.ResourceId equals ur.ResourceId
          select new { r.ResourceName, ur.ResourceQuantity };
4

1 に答える 1

3

したがって、使用しCode firstているモデルは、以下を使用して作成できますEF conventions.

public class User {
    public int Id { get; set; }
    public string UserName { get; set; }

    public virtual ICollection<Resource> Resources { get; set; }
   }

public class Resource {
    public int Id { get; set; }
    public string ResourceName { get; set; }
    public int ResourceQuantity { get; set; }

    public virtual ICollection<User> Users {get;set;}
}

その後、EF はあなたのjunction tableisを生成します。UsersResources.追加のモデルを作成する必要はありません。EF がそれを処理します。

EF で POCO を使用する場合、ナビゲーション プロパティを仮想としてマークすると、遅延読み込みなどの追加の EF サポートを使用できます。そのため、一般的にはナビゲーション プロパティで virtual キーワードを使用することをお勧めします。

アップデート

以下のようなものを試すことができます:

方法 1 :メソッド ベースの構文

imDB.Resources.Where(r => r.Users.Any(u => u.UserId == userId))

方法 2 :クエリ ベースの構文

from r in imDB.Resources
from u in r.Users
where u.UserId == userId
select r;

これがお役に立てば幸いです。

于 2013-02-09T15:03:43.547 に答える