从SQL到LINQ的内部联接转换以及在不同表上的过滤器

时间:2019-04-10 09:56:04

标签: c# entity-framework linq

以下查询将是什么:

select (UserRoles.RoleID, UserRoles.UserID) from UserRoles  
    inner Join Roles on Roles.RolesID = UserRoles.RoleID 
    where Roles.RoleName = 'Seller' AND UserRoles.UserID =1

在实体框架中看起来像

我尝试过:

var check = from a in UserRole 
            join b in Role 
            on a.RoleID equals b.RoleID
            select new{RoleName ="seller"};

但这是错误的,有人可以指导我吗?

1 个答案:

答案 0 :(得分:1)

查询的逐字转换(在SELECT中删除了父级之后)

select UserRoles.RoleID, UserRoles.UserID
from UserRoles  
inner Join Roles on Roles.RolesID = UserRoles.RoleID 
where Roles.RoleName = 'Seller' AND UserRoles.UserID =1;

在您的DbContext称为context的情况下,查询语法中将是以下内容(并且我假设默认的DbSets复数命名约定:)

var result = from a in context.UserRoles
             join b in context.Roles
             on a.RoleID equals b.RoleID
             where b.RoleName == "Seller" && a.UserId == 1
             select new {b.RoleID, a.UserID};

在我们连接表的地方,并投影出您想要的两列。

但是,如果您在EF模型中定义了导航属性UserRole.Role,则不需要显式连接,并且会更加简单(我已切换为lambda语法):

var result = context.UserRoles
   .Where(ur => ur.UserID == 1 && ur.Role.Name == "Seller")
   .Select(ur => new {ur.RoleID, ur.UserID});

同样,仅将两列投影到一个匿名类中。如果您完全省略最后的Select语句,则将获得完整的UserRole实体实例。