2015-06-29 4 views
4

answer here содержит следующий запрос:Как преобразовать этот синтаксис запроса Linq в синтаксис метода?

var query = from role in _db.Roles 
      where role.Name == roleName 
      from userRoles in role.Users 
      join user in _db.Users 
      on userRoles.UserId equals user.Id 
      select user; 

Как бы воспроизвести тот же запрос, используя синтаксис метода Linq?

+1

шаг 1: использовать [ReSharper] (https://www.jetbrains.com/resharper/download/). Я думаю, он может воспроизвести его для вас. –

+0

[LinqPad] (https://www.linqpad.net) может сделать это за вас. –

ответ

3
var query = _db.Roles 
    .Where(role => role.Name == roleName) 
    .SelectMany(role => role.Users) 
    .Join(_db.Users, userRole => userRole.UserId, user => user.Id, (role, user) => user); 

Некоторые объяснения

var query = from role in _db.Roles 
     where role.Name == roleName // this will be translated to .Where 
     from userRoles in role.Users // this is .SelectMany 
     join user in _db.Users // this is .Join 
     on userRoles.UserId equals user.Id // second and third arguments of .Join 
     select user; // last argument of .Join 
+0

Я что-то упустил? Это буквальный перевод запроса, конечно, но в чем смысл третьей строки? Изменить: действительно ли в роли действительно есть свойство навигации, которое не состоит из Пользователей? – ChrisV

+0

Как я понимаю из первоначального запроса (см. «На userRoles.UserId equals user.Id»), эта роль имеет коллекцию объектов UserRole {UserId, RoleId}. – hazzik

+0

@ChrisV тоже, нелистный перевод. Дословный перевод находится в ответе Рики. – hazzik

0

Это Синтаксис метода версии

var query = 
     _db.Roles.Where(role => role.Name == roleName) 
      .SelectMany(role => role.Users, (role, userRoles) => new {role, userRoles}) 
      .Join(_db.Users, @t => userRoles.UserId, user => user.Id, (@t, user) => user); 
+0

Вам не нужен resultSelector с анонимным типом в SelectMany, потому что вы используете только его userRoles. – hazzik