我正在尝试使用 "Not IN" 将 SQL 查询转换为 Linq to Entities
I am trying to convert a SQL Query to Linq to Entities using "Not IN"
我有一个 SQL 查询(存储过程),我很难尝试使用 "NOT IN" 在 Linq 中编写。
这是 SQL 查询:
ALTER PROCEDURE [dbo].[spGetAvailableRoles2User]
@Id nvarchar(128)
AS
BEGIN
SET NOCOUNT ON;
SELECT name
FROM Role
WHERE name NOT IN (SELECT t3.Name
FROM [User] t1
JOIN [UserRole] t2 ON t1.Id = t2.UserId
JOIN [Role] t3 ON t2.RoleId = t3.RoleId
WHERE t1.Id = @Id)
END
这是我在 MVC 操作方法中尝试做的事情
var result = (from x in db.Users
join y in db.IdentityUserRoles on x.Id equals y.UserId
join z in db.Roles on y.RoleId equals z.Id
where x.Id == id
select z.Name);
有人能解释一下我做错了什么吗?
假设您已经在 Entity Framework 中建立了自己的关系和此类设置(并假设角色的名称是唯一的),它应该很简单:
from role in db.Roles
where !role.Users.Any()
select role.Name
如果您没有设置关系以便您的角色实体具有这样的用户属性,那么它会有点复杂.但是,如果您的数据完整性足够好,没有相应用户的 IdentityUserRole 条目,则根本不需要涉及用户 table:
from role in db.Roles
where !db.IdentityUserRoles.Any(iur => iur.Name == role.Name)
select role.Name
我有一个 SQL 查询(存储过程),我很难尝试使用 "NOT IN" 在 Linq 中编写。
这是 SQL 查询:
ALTER PROCEDURE [dbo].[spGetAvailableRoles2User]
@Id nvarchar(128)
AS
BEGIN
SET NOCOUNT ON;
SELECT name
FROM Role
WHERE name NOT IN (SELECT t3.Name
FROM [User] t1
JOIN [UserRole] t2 ON t1.Id = t2.UserId
JOIN [Role] t3 ON t2.RoleId = t3.RoleId
WHERE t1.Id = @Id)
END
这是我在 MVC 操作方法中尝试做的事情
var result = (from x in db.Users
join y in db.IdentityUserRoles on x.Id equals y.UserId
join z in db.Roles on y.RoleId equals z.Id
where x.Id == id
select z.Name);
有人能解释一下我做错了什么吗?
假设您已经在 Entity Framework 中建立了自己的关系和此类设置(并假设角色的名称是唯一的),它应该很简单:
from role in db.Roles
where !role.Users.Any()
select role.Name
如果您没有设置关系以便您的角色实体具有这样的用户属性,那么它会有点复杂.但是,如果您的数据完整性足够好,没有相应用户的 IdentityUserRole 条目,则根本不需要涉及用户 table:
from role in db.Roles
where !db.IdentityUserRoles.Any(iur => iur.Name == role.Name)
select role.Name