Try the following code:
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using SO.Data;
namespace SO.Controllers
{
public class ResultDto
{
public string RoleId { get; set; }
public string UserName { get; set; }
public string RoleName { get; set; }
}
public class HomeController : Controller
{
private readonly ApplicationDbContext _context;
public HomeController(ApplicationDbContext context)
{
_context = context;
}
public IActionResult Index()
{
var result = (from u in _context.Users
join ur in _context.UserRoles on u.Id equals ur.UserId into uur
from uurD in uur.DefaultIfEmpty()
join r in _context.Roles on uurD.RoleId equals r.Id into uurDr
from uurDrD in uurDr.DefaultIfEmpty()
select new ResultDto {RoleId = uurD.RoleId, RoleName = uurDrD.Name, UserName = u.UserName})
.ToList();
return View(result);
}
}
}
Here is the generated SQL:
SELECT [ur].[RoleId], [r].[Name] AS [RoleName], [u].[UserName]
FROM [AspNetUsers] AS [u]
LEFT JOIN [AspNetUserRoles] AS [ur] ON [u].[Id] = [ur].[UserId]
LEFT JOIN [AspNetRoles] AS [r] ON [ur].[RoleId] = [r].[Id]