これはLinqを学ぶ人にとってはかなり複雑です!私はどのようにthis questionとに冗談とグループにどのように尋ねたに彼の明確で非常に有用な答えのために。C#Linq 2つの複合クエリのUNION構文
今、私はすでに非常に複雑なクエリを取り、同様のクエリにUNIONを作成したいと思います。私は以下の2つを持っていますUNION節を使って1つのクエリに入れたというSQLクエリです。
最初のクエリは2つのテーブルを結合します。ただし、2番目のクエリは、組織テーブルの組織にリンクされていない割り当てられていないアセットのため、1つのテーブルに対してのみ行われます。最初のクエリは、組織ごとに別々の行を返します。 2番目のクエリは、割り当てられていないすべてのアセットに対して1行だけを返します。
全体のSQLクエリは次のようになります。
SELECT o.org_hq_name,
o.org_command_name,
o.org_region_name,
o.org_installation_name,
o.org_site_name,
o.org_subsite_name,
o.org_hq_id,
o.org_command_id,
o.org_region_id,
o.org_installation_id,
o.org_site_id,
count(org_site_id) AS count
FROM organization o, asset a
WHERE o.org_hq_id = a.hq_org_id
AND o.org_command_id = a.command_org_id
AND o.org_region_id = a.region_org_id
AND o.org_installation_id = a.installation_org_id
AND o.org_site_id = a.site_org_id
GROUP BY o.org_hq_name,
o.org_command_name,
o.org_region_name,
o.org_installation_name,
o.org_site_name,
o.org_subsite_name,
o.org_hq_id,
o.org_command_id,
o.org_region_id,
o.org_installation_id,
o.org_site_id
UNION ALL
SELECT 'Unassigned',
'Unassigned',
'Unassigned',
'Unassigned',
'Unassigned',
a.hq_org_id,
a.command_org_id,
a.region_org_id,
a.installation_org_id,
a.site_org_id,
count(org_site_id) AS count
FROM asset a
WHERE a.unassigned = 1
GROUP BY a.hq_org_id,
a.command_org_id,
a.region_org_id,
a.installation_org_id,
a.site_org_id
私は以下の持っている、2つの別々のLINQのは、私はUNION句を使用して1つのLINQクエリに入れたいを照会します。以下のコードはちょうどそれを得るためにちょうどtweeking必要があると私は信じています。私は他の質問からの例を使用しようとしましたが、これはまだ分かりません。
var join1 = from a in context.asset
join o in context.organization
on new {hqID = a.hq_org_id, commandID = a.command_org_id, regionID = a.region_org_id, installationID = a.installation_org_id, siteID = a.site_org_id}
equals new {hqID = o.hq_id, commandID = o.command_id, regionID = o.region_id, installationID = o.installation_id, siteID = o.site_id}
group new {a,o} by new { o.org_hq_name,
o.org_command_name,
o.org_region_name,
o.org_installation_name,
o.org_site_name,
o.org_hq_id,
o.org_command_id,
o.org_region_id,
o.org_installation_id,
o.org_site_id
} into gr1
select new
{
org_hq_name = gr1.Key.org_hq_name,
org_command_name = gr1.Key.org_command_name,
org_region_name = gr1.Key.org_region_name,
org_installation_name = gr1.Key.org_installation_name,
org_site_name = gr1.Key.org_site_name,
org_hq_id = gr1.Key.org_hq_id,
org_command_id = gr1.Key.org_command_id,
org_region_id = gr1.Key.org_region_id,
org_installation_id = gr1.Key.org_installation_id,
org_site_id = gr1.Key.org_site_id,
Count = gr1.Count()
};
UNION
var join2 = from a in context.asset
where (a.hq_org_id == 0)
group m by new { a.hq_org_id,
a.command_org_id,
a.region_org_id,
a.installation_org_id,
a.site_org_id
} into gr2
select new
{
org_hq_name = "unknown",
org_command_name = "unknown",
org_region_name = "unknown",
org_installation_name = "unknown",
org_site_name = "unknown",
org_hq_id = gr2.Key.org_hq_id,
org_command_id = gr2.Key.org_command_id,
org_region_id = gr2.Key.org_region_id,
org_installation_id = gr2.Key.org_installation_id,
org_site_id = gr2.Key.org_site_id,
Count = gr2.Count()
};
ありがとうございました。答えは、このような複雑なクエリに苦労している他の人に役立つと確信しています。
問題は何ですか? 'UNION ALL'はLINQ' Concat'に変換されます。 'var query = join1.Concat(join2);'はすべきです。 –
シュート!それは....それは簡単だった!私はそれを試してみましょう。 :-) – Patricia
@IvanStoev:それはうまくいった。あなたがあなたの提案を答えさせたら、私はあなたにポイントを与えることができるでしょう! – Patricia