2个复杂查询的C Linq UNION语法

2个复杂查询的C Linq UNION语法,linq,group-by,aggregate,union-all,Linq,Group By,Aggregate,Union All,对于一个刚刚学习Linq的人来说,这是相当复杂的!我问他如何加入并分组,并大声呼喊他明确且非常有用的回答 现在,我想利用我已经非常复杂的查询,创建一个类似查询的联合。下面有两个单独的SQL查询,我使用UNION子句将它们放入一个查询中 第一个查询连接两个表。但第二个查询只针对一个表,因为它针对的是未与组织表中的组织链接的未分配资产。第一个查询将为每个组织返回一个单独的行。第二个查询将只为所有未分配的资产返回一行 整个SQL查询如下所示: SELECT o.org_hq_name,

对于一个刚刚学习Linq的人来说,这是相当复杂的!我问他如何加入并分组,并大声呼喊他明确且非常有用的回答

现在,我想利用我已经非常复杂的查询,创建一个类似查询的联合。下面有两个单独的SQL查询,我使用UNION子句将它们放入一个查询中

第一个查询连接两个表。但第二个查询只针对一个表,因为它针对的是未与组织表中的组织链接的未分配资产。第一个查询将为每个组织返回一个单独的行。第二个查询将只为所有未分配的资产返回一行

整个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
下面有两个单独的Linq查询,我想使用UNION子句将它们放入一个Linq查询中。我相信下面的代码只需要花一点时间就可以完成。我试着使用其他问题的例子,但我仍然无法理解这一点

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()
         };
事先谢谢你的帮助。我相信这个答案会对其他正在处理类似这样复杂问题的人有所帮助。

等级宠物 { 公共字符串名称{get;set;} 公共整数{get;set;} } //此方法创建并返回Pet对象数组。 静态宠物猫 { 宠物[]猫={新宠物{名字=大麦,年龄=8}, 新宠物{Name=Boots,Age=4}, 新宠物{名字=胡须,年龄=1}}; 返回猫; } //此方法创建并返回Pet对象数组。 静态宠物狗 { 宠物[]狗={新宠物{Name=Bounder,年龄=3}, 新宠物{Name=Snoopy,Age=14}, 新宠物{Name=Fido,Age=9}}; 返回犬; } 公共静态空洞concate1 { 宠物[]猫=猫; 宠物[]狗=狗; //将cat名称集合连接到 //使用Concat收集狗名。 IEnumerable查询= 猫是可询问的 .Selectcat=>cat.Name .Concatdogs.Selectdog=>dog.Name; 查询中的foreach字符串名称 Console.WriteLinename; } //此代码生成以下输出: // //大麦 //靴子 //胡须 //边界 //史努比
//Fidow有什么问题?UNION ALL转换为LINQ Concat,例如var query=join1.Concatjoin2;应该的,开枪!如果那样做了……那很容易!让我试试-@伊凡斯托夫:这奏效了。如果你能回答你的建议,我就能给你分数!很高兴它起到了作用,但它太基本了,不值得加分:谢谢你的好意,谢谢!欢迎来到堆栈溢出!虽然这个代码片段可能会回答OP的问题,但如果您添加一个解释,那么答案会更有用。请注意,只有代码的答案往往会被标记为质量审查,这可能会导致它们被删除。此外,这只是MSDN的复制/粘贴。尝试将其应用于OP的代码。