Ответ 1
Основной синтаксис для "левого соединения" в Linq выглядит так:
from x in table1
join y in table2 on x.id equals y.id into jointable
from z in jointable.DefaultIfEmpty()
select new
{
x.Field1,
x.Field2,
x.Field3,
Field4 = z == null ? 0 : z.Field4
};
В вашем случае я немного смущен, потому что отношения сущностей, которые вы, кажется, используете в Linq, не соответствуют тем, которые подразумевает ваш SQL; являются отношения здесь нуля или одного, нулевого или многих, один к одному и т.д.? В частности, вы делаете это:
from h in context.Authentications
join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId
но ваш SQL подразумевает, что "Аутентификация" является родителем здесь с нулевыми или более "Авторизованными" детьми, а не наоборот, что было бы более похоже:
from h in context.Authentications
from t in h.Authorizations.DefaultIfEmpty()
Если вы можете дать нам лучшее представление о модели данных и о том, какие данные вы хотите получить, мы сможем легче объяснить, как этот запрос будет выглядеть в Linq. Предполагая, что ваши отношения соответствуют тому, что подразумевается SQL, вы должны получить то, что хотите, используя следующие запросы Linq:
var query = from h in context.Authentications
from t in h.Authorizations.DefaultIfEmpty()
select new
{
h.AuthenticationId,
h.Username,
Permissions = t == null ? null : t.Permissions,
Organizations = t == null ? new EntitySet<Organization>() : t.Organizations
};
var query2 = from x in query
from o in x.organizations.DefaultIfEmpty()
select new
{
AUTHENTICATION_ID = (short?)x.AuthenticationId,
x.Username,
x.Permissions,
OrganizationIdentifier = o == null ? null : o.OrganizationIdentifier,
OrganizationID = o == null ? (short?)null : o.OrganizationID
};