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