Левое внешнее соединение в Linq to Entities/SQL

Как я могу написать следующий SQL в 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'  

person Harindaka    schedule 12.06.2011    source источник
comment
var query = from r в Roles присоединиться к ur в UsersInRoles на новом {f1 = r.Rolename, f2 = 'ADMIN'} равно new {f1 = ur.Rolename, f2 = ur.Username} в temp из x в temp.DefaultIfEmpty( ) выберите новый {f1 = r.RoleName, f2 = x.Username};   -  person Harindaka    schedule 12.06.2011
comment
Я слышал, что DefaultIfEmpty не поддерживается в EF. Это правда?   -  person Harindaka    schedule 12.06.2011
comment
DefaultIfEmpty поддерживается, начиная с EF 4.0.   -  person Ladislav Mrnka    schedule 12.06.2011


Ответы (2)


Это сработало для меня. Спасибо за все предложения.

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) };

Сгенерированный SQL выглядит следующим образом

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])
person Harindaka    schedule 13.06.2011

Я бы сделал это так:

from role in db.Roles
let isInRole = role.UsersInRoles.Any(u => u.UserName == "ADMIN")
select new { role.RoleName, isInRole }

Хотя сгенерированный SQL не так хорош, как ваш.

person svick    schedule 12.06.2011
comment
Спасибо, вы направили меня в правильном направлении. Остановился на решении ниже. - person Harindaka; 14.06.2011