我是lambda和mvc c#的新手。我使用c#进行简单查询。现在我遇到了这种类型的查询,我不知道如何实现这个lambda。多个表中没有连接
select distinct sub.SubModuleName --[SMSSysmanager].
from
[dbo].tbl_Securable sec,
[dbo].aspnet_UsersInRoles usr,
[dbo].aspnet_Roles rol,
[dbo].tbl_SubModule sub,
[dbo].tbl_Module mod
where
usr.UserId=@userid and
usr.roleID=sec.roleID and
rol.roleId=sec.roleID and
rol.LoweredRoleName = LOWER(@RoleName) and
sec.HasAccess=1 and
sec.ModuleId=sub.SubModuleId
答案 0 :(得分:0)
实际上有多个内连接,但它是oldskool。
它会转化为:
var distinctItems = (from sec in db.tbl_Securable
from usr in db.aspnet_UsersInRoles
from rol in db.aspnet_Roles
from sub in db.tbl_SubModule
// from mod in db.tbl_Module
where
usr.UserId == userid &&
usr.roleID == sec.roleID &&
rol.roleId == sec.roleID &&
rol.LoweredRoleName == roleName.ToLower() &&
sec.HasAccess &&
sec.ModuleId == sub.SubModuleId
select
sub.SubModuleName).Distinct();
我更喜欢指定连接,因为我发现它使语法更合理。
var distinctItems = (from sub in db.tbl_SubModule
// from mod in db.tbl_Module
join sec in db.tbl_Securable on sub.SubModuleId equals sec.ModuleId
join usr in db.aspnet_UsersInRoles on sec.roleID equals usr.roleID
join rol in db.aspnet_Roles on sec.roleID equals rol.roleId
where usr.UserId == userid
where sec.HasAccess
where rol.LoweredRoleName == roleName.ToLower()
select sub.SubModuleName).Distinct();
我对tbl_Module
有点困惑,因为它没有在任何地方使用过,因为你在sub.SubModuleName上做了一个截然不同的事情,所以它完全是不必要的。
答案 1 :(得分:0)
var distinctItems = (from sec in context.tbl_Securable
from usr in context.aspnet_UsersInRoles
from rol in context.aspnet_Roles
from sub in context.tbl_SubModule
from mod in context.tbl_Module
where
usr.UserId == userid &&
usr.roleID == sec.roleID &&
rol.roleId == sec.roleID &&
rol.LoweredRoleName == roleName.ToLower() &&
sec.HasAccess &&
sec.ModuleId == sub.SubModuleId
select
sub.SubModuleName).Distinct();