これは私がEF4.3に変換したいSQLクエリです
command = database.GetSqlStringCommand(@"
select
H.AUTHENTICATION_ID,
USERNAME,
PERMISSIONS,
ORGANIZATION_IDENTIFIER,
O.ORGANIZATION_ID
from
AUTHENTICATION H
left join [AUTHORIZATION] T on H.AUTHENTICATION_ID=T.AUTHENTICATION_ID
join ORGANIZATION O on O.ORGANIZATION_ID = T.ORGANIZATION_ID
order by H.AUTHENTICATION_ID");
ここに私が思いつくことができる最高のLINQがあります:
var query = from h in context.Authentications
join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId
join o in context.Organizations on t.Organizations.OrganizationId equals o.OrganizationId
orderby
h.AuthenticationId
select new
{ AUTHENTICATION_ID = (Int16?)h.AuthenticationId,
h.Username,
t.Permissions,
o.OrganizationIdentifier,
OrganizationID = (Int16?)o.OrganizationId
};
私は最初の結合(承認と認証の間)をマージする必要があることを知っています。xと言ってDefaultIfEmptyを適用しますが、構文を理解できません。
編集:明確にするための画像:
どんな助けも高く評価されます。よろしく。
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で暗黙的に示されているものと一致しないため、少し混乱しています。ここでの関係は、0または1、0または多、1対1などですか?具体的には、次のようにします。
from h in context.Authentications
join t in context.Authorizations on h.AuthenticationId equals t.Authentications.AuthenticationId
しかし、SQLは、「Authentication」がゼロ以上の「Authorization」の子を持つ親であることを示しており、その逆ではなく、次のようになります。
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
};
質問図に存在する外部キーを考えると、このようなものはどうですか?
var query = from a in context.Authentications
select new
{
a.AuthenticationID,
a.Username,
a.Authorisations.Permissions ?? false,
a.Authorisations.Organisations.OrganisationIdentifier ?? 0
a.Authorisations.Organisations.OrganisationID ?? 0
};