型号:
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;
我希望这对你有帮助。