【问题标题】:I am trying to convert a SQL Query to Linq to Entities using "Not IN"我正在尝试使用“Not IN”将 SQL 查询转换为 Linq 到实体
【发布时间】:2016-03-08 21:19:13
【问题描述】:

我有一个 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);

能否解释一下我做错了什么?

【问题讨论】:

  • 我看过了,但我有两个 where 子句,不知道如何用这两个子句编写它
  • @PsyChotic,Where 条件的数量并不重要!

标签: c# sql-server linq-to-entities


【解决方案1】:

假设您已经在 Entity Framework 中正确设置了关系和此类设置(并假设角色的名称是唯一的),它应该很简单:

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

如果您没有设置关系以便您的角色实体具有这样的用户属性,那么它会有点复杂。但是,如果您有足够好的数据完整性,没有相应的用户就没有 IdentityUserRole 条目,那么根本不需要涉及用户表:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    相关资源
    最近更新 更多