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



型号:

 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"此外,一旦被选中,我是否需要一个全新的模型来只携带这两列

还要注意,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 };

因此,如果使用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.一样。你不需要像以前那样创建额外的模型。英孚将负责这方面的工作。

将POCO与EF一起使用时,如果将导航属性标记为虚拟的,你可以使用额外的EF支持,比如LazyLoading。所以在一般在导航属性中使用虚拟关键字做一个好的练习。

更新

你可以试试下面的东西:

方法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;

我希望这对你有帮助。

相关内容

  • 没有找到相关文章

最新更新