Преобразование SQL в LINQ с внутренним объединением и где фильтры на разных таблицах - PullRequest
1 голос
/ 10 апреля 2019

Как будет выглядеть следующий запрос:

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

в Entity Framework?

Я пробовал это:

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

но это не так, может кто-то пожалуйставести меня?

1 Ответ

1 голос
/ 10 апреля 2019

Дословное преобразование запроса (после удаления родителей в 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};

Где мы объединяем таблицы и проецируем два столбца, которые вы хотели.

Однако, если вы определили свойство навигации UserRole.Role в своей модели EF, явное объединение не требуется, и было бы намного проще (я перешел на лямбда-синтаксис):

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

Опять же, проекция только двух столбцов в анонимный класс. Если вы полностью опустите последний оператор Select, вы получите полный UserRole экземпляр сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...