使用Linq查询连接存储库中的Resource表和Resources_Role表



如何将资源表连接到Resources_role表,其中Resources_id列在两个表中都是通用的。下面是我使用Role_id获取Resources表的代码,但是我希望从Resources表中获取与Resources_Role共享同一Resources_id列的所有记录。我该如何加入,下面是我的代码

public IQueryable <Resources_Role> FindResourceByRoleID(int RoleId)
{
var roleid = from p in context.Resources_Role 
select p;
roleid = roleid.Where(p => p.ROLE_ID==(RoleId));
return roleid;
}

您应该注意的是方法返回类型。根据您想要返回的内容,您应该根据您正在使用的JOIN查询的结果集调整返回类型:

// returning resources
public IQueryable<Resources> FindResourceByRoleID(int RoleId)
{
return (from res in context.Resources
join role in context.Resources_Role
on res.resources_id equals role.resources_id
where res.ROLE_ID == RoleId
select res);
}
// returning resource role
public IQueryable<Resources_Role> FindResourceRoleByRoleID(int RoleId)
{
return (from role in context.Resources_Role
join res in context.Resources
on role.resources_id equals res.resources_id
where res.ROLE_ID == RoleId
select role);
}

上面的查询将生成如下所示的SQL语句:

-- returns resources
SELECT t0.* FROM Resources AS t0 INNER JOIN Resources_Role AS t1
ON t0.resources_id = t1.resources_id
WHERE t0.ROLE_ID = @RoleId
-- returns resources role
SELECT t0.* FROM Resources_Role AS t0 INNER JOIN Resources AS t1
ON t0.resources_id = t1.resources_id
WHERE t1.ROLE_ID = @RoleId

注意:无法将类型System.Linq.IQueryable<Resource>隐式转换为System.Linq.IQueryable<Resources_Role>不言自明:发生这种情况是因为您的查询返回IQueryable<Resource>,但方法返回的类型设置为IQueryable<Resources_Role>。您必须调整查询以返回IQueryable<Resources_Role>

从方法中获得角色ID后,可以执行以下操作来返回资源:

var resources = from resource in context.Resources
where resource.ROLE_ID == roleId
join resource_role in context.Resources_Role 
on resource.resources_id equals resource_role.resource_id
select resource;

要获得Resource_Role,您可以执行以下操作:

var resource_role = from role in context.Resource_Roles
join resource in context.Resources_Role.Where(resource_role => resource_role.ROLE_ID == roleId)
on role.resources_id equals resource.resource_id
select role;

恐怕我没有一个可用的MVC环境来在atm中测试这些,但这应该是一个很好的起点。

最新更新