我正在使用Repository模式,我想编写一个接收角色的方法,并返回属于该角色的用户的Iqueryable。 (我不确定是否正确的方式是接收角色对象或role_id ...在任何情况下,我怎么能这样做?我不喜欢查询结构,我更喜欢linq的方法结构。 使用users_roles连接表的用户和角色很多。
private ClasesDataContext db = new ClasesDataContext();
public IQueryable GetByRole(Role role)
{
return db.Users.Where();
}
答案 0 :(得分:1)
如果您有Role对象的实例
public IQueryable<User> GetByRole(Role role) {
return db.Users.Where(u => u.Role == role);
}
会起作用。
如果您不知道该角色的Id或其他属性,则可能会更好。
public IQueryable<User> GetByRoleId(int roleId) {
return db.Users.Where(u => u.Role.Id == roleId);
}
答案 1 :(得分:1)
也许尝试类似的事情:
public IQueryable<User> GetByRoleId(Role role) {
return db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => ur.User);
}
UsersRoleJoinTable是多对多连接表。
希望它有所帮助。
更新:select(ur =&gt; ur.User)告诉linq“db.UsersRoleJoinTable.Where返回的每一行(ur =&gt; ur.Role == role) “我们希望让用户与UsersRoleJoinTable对象相关联。如果你想要一个用户ID列表,你可以通过select(ur =&gt; ur.id)告诉linq只选择user.id。把linq的select视为某种“为每一行做这个并把它放在返回的列表而不是原始行”
这种方法有一个缺点,我相信在这种情况下,Linq生成sql以从Join表(UsersRoleJoinTable)获取行,然后对于返回的每一行,执行另一个查询以查找User。我可能错了,所以检查Linq生成的SQL:
string sql_query = db.UsersRoleJoinTable.Where(ur => ur.Role == role).select(ur => u.User).ToString();
然后打印sql_query的值或在调试模式下观察它。如果Linq实际上正在进行多个查询,那么我认为最好的解决方案是在SQL Server中创建一个视图或存储过程以获取与该角色关联的用户,然后将视图或存储过程添加到Visual Studio设计器中,以便您可以称视图为:
db.GetUsers(role_id) //if using a GetUsers stored procedure
或
db.UsersByRoleView.where(ur => ur.role_id == passed_role_id) //if using a UsersByRoleView view