我有一个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中建立了关系并进行了正确的设置(并假定Role's Name是唯一的),那么它应该很简单:

from role in db.Roles
where !role.Users.Any()
select role.Name


如果您没有设置关系以使您的Role实体具有这样的Users属性,那么它将变得更加复杂。但是,如果您具有足够好的数据完整性,没有相应的User就没有IdentityUserRole条目,那么就根本不需要涉及Users表:

from role in db.Roles
where !db.IdentityUserRoles.Any(iur => iur.Name == role.Name)
select role.Name

关于c# - 我正在尝试使用“Not IN”将SQL查询转换为Linq to Entities,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35878213/

10-13 07:32