Search code examples
sqllinqentity-frameworklinq-to-entities

Left Outer Join in Linq to Entities / SQL


How can I write the following SQL in LINQ to Entities?

SELECT r.rolename,
       ( CASE
           WHEN ur.username IS NULL THEN 0
           ELSE 1
         END ) AS isinrole
FROM   bgt.roles r
       LEFT OUTER JOIN bgt.usersinroles ur
         ON ur.rolename = r.rolename
            AND ur.username = 'ADMIN'  

Solution

  • This worked for me. Thanks for all the suggestions.

    var query = 
    from r in Roles
    from ur in UsersInRoles
    .Where(v => v.Rolename == r.Rolename && v.Username == "ADMIN")
    .DefaultIfEmpty()
    select new { Rolename = r.Rolename, IsInRole = (ur.Username != null) };
    

    The generated SQL is as follows

    SELECT 
    1 AS [C1], 
    [Extent1].[Rolename] AS [Rolename], 
    CASE WHEN ([Extent2].[Username] IS NOT NULL) THEN cast(1 as bit) WHEN ([Extent2].[Username] IS NULL) THEN cast(0 as bit) END AS [C2]
    FROM  [bgt].[Roles] AS [Extent1]
    LEFT OUTER JOIN [bgt].[UsersInRoles] AS [Extent2] ON ([Extent2].[Rolename] = [Extent1].[Rolename]) AND ('ADMIN' = [Extent2].[Username])