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