我有两个简单的表,Users
和Roles
。两者都有自己的主键ID
以及一些与此问题无关的其他独特属性。两个表都具有另一个的virtual IList
属性。所以User
对象作为以下属性:
public virtual IList<Role> Roles { get; set; }
Role
对象具有以下属性:
public virtual IList<User> Users { get; set; }
两者都允许我在C#中轻松地从User
导航到Role
s或从Role
导航到User
。
EntityTypeConfiguration
的{{1}}没有Role
特有的内容。但是,User
具有以下User
来创建Junction表:
Role
到目前为止,这完全符合我需要做的一切。现在,我需要一种方法来查询 this.HasMany(x => x.Roles)
.WithMany(x => x.Users)
.Map(x => {
x.ToTable("UserRole", "xref");
x.MapLeftKey("UserID");
x.MapRightKey("RoleID");
});
表中的记录总数。在SQL中,我只需执行以下操作:
xref.UserRole
生活将是完美的。但EF采用Junction表并将其置于幕后。我无法做出类似的事情:
SELECT COUNT(*) FROM xref.UserRole
我已经遍布这里和网络,并没有找到任何特定于这样的简单Junction表的东西。其他答案有额外的字段或不是真正的多对多连接,所以它不适用于我的情况。
有没有办法,在DbContext上有一些扩展方法或更深的属性来到那个表,所以我可以在Linq查询中使用它?我知道我可以写一个存储过程,但这看起来有点像kluge。
答案 0 :(得分:3)
我需要一种方法来查询
中的记录总数xref.UserRole
表
所以真正寻找的是分配给所有用户的角色总数。这可以计算为:
db.Users.Sum(u => u.Roles.Count());
虽然如果真的被翻译为
,我会感到惊讶SELECT COUNT(*) FROM xref.UserRole
如果您想运行那个确切的查询,您可以随时使用SqlQuery
。