如何在Linq-To-SQL中编写此SQL查询?

时间:2009-11-15 13:45:49

标签: asp.net-mvc linq-to-sql

我是MVC的新手并且进展顺利,但在后面的SQL等方面有点挣扎

select * from aspnet_Users 
where Active = 1 and UserId in (select UserId from aspnet_UsersInRoles,aspnet_Roles where aspnet_Roles.RoleId = aspnet_UsersInRoles.RoleId and aspnet_Roles.RoleName = 'Auth Level 1')

表和字段是:

aspnet_Users (UserId int, Active bit, eMail varchar)
aspnet_UsersInRoles (UserId, RoleId)
aspnet_Roles (RoleId int, RoleName varchar)

我的尝试 - 但到目前为止看起来不完整:

        LmsDataContext db = new LmsDataContext();
        var AuthUsers = from aspnet_User in db.aspnet_Users
                        join userinroles in db.aspnet_UsersInRoles on aspnet_User.UserId equals userinroles.UserId
                        where aspnet_User.Active 
                        select aspnet_User;

非常感谢提前

2 个答案:

答案 0 :(得分:4)

假设您已在数据库(或设计器)中定义了关联,您应该能够通过属性访问相关实体,而无需借助显式连接。以下示例未经测试,但应该让您走上正确的轨道。基本思想是查找关联角色是否具有正确名称的关联,并选择用户(如果找到)。

var users = db.aspnet_Users
              .Where( u => u.Active )
              .Any( u => u.aspnet_UsersInRoles
                          .Any( r => r.aspnet_Roles.RoleName == "Auth Level 1" ) );

答案 1 :(得分:0)

感谢tvanfossen的快速回复,我试图实现你的方式,但无法做到正确。我认为你的方法很简洁,我得到以下工作:

    // Loop through all the Users on the System who are in Auth Level 1 Role and Email them
    LmsDataContext db = new LmsDataContext();
    var AuthUsers = from aspnet_User in db.aspnet_Users
                    join userinroles in db.aspnet_UsersInRoles on aspnet_User.UserId equals userinroles.UserId
                    where aspnet_User.Active 
                    && userinroles.aspnet_Role.RoleName == "Auth Level 1"
                    select aspnet_User;

干杯

Ĵ