2017-05-05 53 views
0

これは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() 
     }; 

ありがとうございました。答えは、このような複雑なクエリに苦労している他の人に役立つと確信しています。

+2

問題は何ですか? 'UNION ALL'はLINQ' Concat'に変換されます。 'var query = join1.Concat(join2);'はすべきです。 –

+1

シュート!それは....それは簡単だった!私はそれを試してみましょう。 :-) – Patricia

+0

@IvanStoev:それはうまくいった。あなたがあなたの提案を答えさせたら、私はあなたにポイントを与えることができるでしょう! – Patricia

答えて

-1

class Pet 
 
{ 
 
    public string Name { get; set; } 
 
    public int Age { get; set; } 
 
} 
 

 
// This method creates and returns an array of Pet objects. 
 
static Pet[] GetCats() 
 
{ 
 
    Pet[] cats = { new Pet { Name="Barley", Age=8 }, 
 
        new Pet { Name="Boots", Age=4 }, 
 
        new Pet { Name="Whiskers", Age=1 } }; 
 
    return cats; 
 
} 
 

 
// This method creates and returns an array of Pet objects. 
 
static Pet[] GetDogs() 
 
{ 
 
    Pet[] dogs = { new Pet { Name="Bounder", Age=3 }, 
 
        new Pet { Name="Snoopy", Age=14 }, 
 
        new Pet { Name="Fido", Age=9 } }; 
 
    return dogs; 
 
} 
 

 
public static void ConcatEx1() 
 
{ 
 
    Pet[] cats = GetCats(); 
 
    Pet[] dogs = GetDogs(); 
 

 
    // Concatenate a collection of cat names to a 
 
    // collection of dog names by using Concat(). 
 
    IEnumerable<string> query = 
 
     cats.AsQueryable() 
 
     .Select(cat => cat.Name) 
 
     .Concat(dogs.Select(dog => dog.Name)); 
 

 
    foreach (string name in query) 
 
     Console.WriteLine(name); 
 
} 
 

 
// This code produces the following output: 
 
// 
 
// Barley 
 
// Boots 
 
// Whiskers 
 
// Bounder 
 
// Snoopy 
 
// Fido

+1

ようこそスタックオーバーフロー!このコード断片はOPの質問に答えるかもしれませんが、説明を追加すると答えがより有用になります。コードのみの回答には品質レビューのフラグが立てられている可能性があります。また、これはMSDNのコピー/ペーストです。それをOPのコードに適用してみてください。 –

関連する問題