LINQ SQL尝试将3个记录集合并为一个

时间:2014-12-22 22:36:22

标签: c# sql linq linq-to-sql

我有三组数据代表一个计数值,按国家/地区代码分组。

select distinct m.CountryCode, count(m.MetricId) as 'Impressions'
from Metrics m
  inner join impressions i on m.MetricId = i.MetricId
where ...
group by m.CountryCode

select distinct m.CountryCode, count(m.MetricId) as 'Conversions'
from Metrics m
  inner join Conversions c on m.MetricId = c.MetricId
where ...
group by m.CountryCode

..还有第三个与一个名为" Leads"

的桌子相连的人

所以这些都给了我一组不同的国家代码和相应的数字。

  CountryCode    Impressions
    AU             25
    DE             34
    US             264



   CountryCode    Conversions
    AU             11
    US             140
这样的事情。所以我的目标是将所有三个记录集合并为一个如下所示:

CountryCode    Impressions    Conversions    Leads
US             264             140           98

我想学习如何使用LINQ执行此操作,而无需执行三个查询。这是一个更直接的方法,但我已经做了太长时间,我的眼睛没有看到它。非常感谢在正确的方向上轻推,谢谢

1 个答案:

答案 0 :(得分:2)

        var qry1 = (from m in Db.Metrics
                    join i in Db.Impressions on m.MetricId equals i.MetricId
                    //where 
                    group m by m.CountryCode into grp
                    select new
                    {
                        CountryCode = grp.Key,
                        Impressions = grp.Count()
                    });

        var qry2 = (from m in Db.Metrics
                    join c in Db.Conversions on m.MetricId equals c.MetricId
                    //where 
                    group m by m.CountryCode into grp
                    select new
                    {
                        CountryCode = grp.Key,
                        Conversions = grp.Count()
                    });

        var result = (from x in qry1
                      join y in qry2 on x.CountryCode equals y.CountryCode
                      select new
                      {
                          CountryCode = x.CountryCode,
                          Impressions = x.Impressions,
                          Conversions = y.Conversions
                      });

        var lst = result.ToList();

前两个查询是懒惰的,它们还没有执行。结果变量只是将它们连接在一起,最后一部分执行最终查询并实现对象 在单独的查询中拆分这些可以帮助保持简单。