实体框架/ LINQ:从多个表中选择列?

时间:2013-02-09 14:03:49

标签: linq entity-framework ef-code-first many-to-many entity-framework-5

型号:

 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; }
}

我想从资源模型中选择“ResourceName”,从UserResource模型中为给定的“UserId”选择“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 };

1 个答案:

答案 0 :(得分: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 tableUsersResources.您不需要像创建其他模型一样创建其他模型.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;

我希望这会对你有所帮助。