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”,我想从资源模型中选择“ResourceName”,从 UserResource 模型中选择“ResourceQuantity”。另外,一旦选择,我是否需要一个全新的模型来只携带这两个指定的列?

另请注意,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 table的原样,因为UsersResources.您不需要像以前那样创建额外的模型。EF 会照看这些。

将 POCO 与 EF 一起使用时,如果将导航属性标记为虚拟,则可以使用其他 EF 支持,例如延迟加载。因此,通常在导航属性中使用虚拟关键字被认为是一种很好的做法。

更新

您可以尝试以下方法:

方法 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 回答