帮助Linq到Sql

时间:2010-02-03 14:19:24

标签: linq-to-sql many-to-many

我正在使用Repository模式,我想编写一个接收角色的方法,并返回属于该角色的用户的Iqueryable。 (我不确定是否正确的方式是接收角色对象或role_id ...在任何情况下,我怎么能这样做?我不喜欢查询结构,我更喜欢linq的方法结构。 使用users_roles连接表的用户和角色很多。

     private ClasesDataContext db = new ClasesDataContext();
        public IQueryable GetByRole(Role role)
        {
            return db.Users.Where();
        }

2 个答案:

答案 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