Sql server 需要将发布的sql查询转换为LINQ

Sql server 需要将发布的sql查询转换为LINQ,sql-server,linq,c#-4.0,Sql Server,Linq,C# 4.0,我如何在linq中进行查询请告知 select * from tblPermission where RoleId in (select roleid from tbluserrole where userid = @userID) 您可以通过两种方式执行此操作: var roles = tbluserrole.Where(e => e.userid == userId).Select(e => e.roleid).ToList(); var prmsns = tblPermi

我如何在linq中进行查询请告知

select * 
from tblPermission 
where RoleId in (select roleid from tbluserrole where userid = @userID)

您可以通过两种方式执行此操作:

var roles = tbluserrole.Where(e => e.userid == userId).Select(e => e.roleid).ToList();
var prmsns = tblPermission.Where(e => roles.Contains(e.RoleId).ToList()

编辑:

您可以这样使用内部联接来完成此操作

var prmsns = (from e in tblPermission
    join f in tbluserrole on tblPermission.RoleId equals tbluserrole.roleid
    where f.userId == userId
    select e).ToList();

从SQL转换为LINQ时,请按照LINQ短语的顺序进行转换。如果SQL具有表别名,请将其用作范围变量。如果查询包含子查询,则首先以相同的方式对其进行翻译。将
中的
翻译为
包含的

var roles = from ur in tbluserrole where ur.userid == parmUserId select ur.RoleId;
var ans = from p in tblPermission
          where roles.Contains(p.RoleId)
          select p;

请检查您是否确实不需要将任何SQL查询转换为LINQ。LINQ不是SQL的替代品。它是一种建立在类似ORM的实体框架之上的语言。您需要创建适当的实体和关系,这样就不必将查询复制到代码中。那是ORM的工作。您需要从用户上下文编写类似于
的查询。UserID=145的用户选择user
并从
用户返回的
角色
对象的
权限
集合中读取权限。角色
集合您应该有一个
用户
实体和
角色
集合。具有返回
权限
对象的
权限
集合的
角色
实体。如果由于非标准表名(使用任何类型的表前缀都是错误的),EF无法检测到关系,则可以在上下文的配置方法中自行配置关系。最后,您应该能够编写
dbContext.Users.Where(u=>u.ID=145)、SelectMany(u=>u.Roles)、SelectMany(r=>r.Permissions)
dbContext.Roles.Where(r=>r.userID=145)。选择many(r=>r.Permissions)将单个内部联接转换为两个单独的查询是个坏主意。首先,它不会以同样的方式工作-在()
语句中,可以传递给
的值数量是有限制的。其次,它需要两次往返,并导致至少两倍的时间编辑答案,因此您可以使用justjoin
var roles = from ur in tbluserrole where ur.userid == parmUserId select ur.RoleId;
var ans = from p in tblPermission
          where roles.Contains(p.RoleId)
          select p;