c# - 两个对象上的 Linq 完全外连接

标签 c# sql linq

我有两个名为 CountryMobility 的对象,我相信我需要将它们与完整的外部联接结合起来。我如何使用 linq 来做到这一点?

public class CountryMobility
{
    public string countryCode { get; set; }
    public int inbound { get; set; }
    public int outbound { get; set; }
} 

我想像这样组合其中两个对象:

inboundStudents:
countryCode | inbound | outbound
         EG |    2    |     0
         CA |    3    |     0
         CH |    5    |     0

outboundStudents:
countryCode | inbound | outbound
         PE |    0    |     1
         CA |    0    |     4
         CH |    0    |     5


                      -
                      -
                      -
                      -
                      V

combinedStudents:
countryCode | inbound | outbound
         PE |    0    |     1
         CA |    3    |     4
         CH |    5    |     5
         EG |    2    |     0

我尝试了以下 linq 语句,但无法找出正确的语法。我目前在附近遇到语法错误 两个语句中都有 temp.DefaultIfEmpty(new { first.ID, inbound = 0, outbound=0 }) 。

var leftOuterJoin = 
    from first in inboundActivities
    join last in outboundActivities
    on first.countryCode equals last.countryCode
    into temp
    from last in temp.DefaultIfEmpty
    (new { first.countryCode, inbound = 0, outbound=0 })
    select new CountryMobility
    {
        countryCode = first.countryCode,
        inbound = first.inbound,
        outbound = last.outbound,
    };
var rightOuterJoin = 
    from last in outboundActivities
    join first in inboundActivities
    on last.countryCode equals first.countryCode
    into temp
    from first in temp.DefaultIfEmpty
    (new { last.countryCode, inbound = 0, outbound = 0 })
    select new CountryMobility
    {
        countryCode = last.countryCode,
        inbound = first.inbound,
        outbound = last.outbound,
    };

var fullOuterJoin = leftOuterJoin.Union(rightOuterJoin); 

最佳答案

在您的最新信息之后。在我看来,你可以做一些更简单的事情。即随后按国家/地区代码分组的 UNION ALL。 可以使用 Concat 方法创建 UNION ALL

下面的示例对我有用(在内存集合中使用)。该查询显示在 Run 方法中。

public class CountryMobility
{
    public string countryCode { get; set; }
    public int inbound { get; set; }
    public int outbound { get; set; }
}

public static class JoinedMobilityQuery
{
    static CountryMobility[] inbound = {
        new CountryMobility() { countryCode = "EG", inbound = 2 },
        new CountryMobility() { countryCode = "CA", inbound = 3 },
        new CountryMobility() { countryCode = "CH", inbound = 5 },
    };
    static CountryMobility[] outbound = {
        new CountryMobility() { countryCode = "PE", outbound = 1 },
        new CountryMobility() { countryCode = "CA", outbound = 4 },
        new CountryMobility() { countryCode = "CH", outbound = 6 },
    };

    static IQueryable<CountryMobility> Inbound()
    {
        return inbound.AsQueryable();
    }

    static IQueryable<CountryMobility> Outbound()
    {
        return outbound.AsQueryable();
    }

    public static void Run()
    {
        var transfers = from t in Inbound().Concat(Outbound())
                        group t by t.countryCode into g
                        select new CountryMobility() {
                            countryCode = g.Key,
                            inbound = g.Sum(x => x.inbound),
                            outbound = g.Sum(x => x.outbound),
                        };
        foreach (var transfer in transfers)
            Console.WriteLine("{0}\t{1}\t{2}", transfer.countryCode, transfer.inbound, transfer.outbound);
    }
}

关于c# - 两个对象上的 Linq 完全外连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29690084/

相关文章:

c# - 可以在文件名或扩展名中使用的 DateTime.ToString() 格式?

使用 Borland Delphi 远程查询 SQL Server 2005

linq - 使用 Entity Framework 批量插入/更新

linq - F# groupBy - 系统异常 : unrecognized method call

.net - 任何用于逆透视数据的 .Net 函数或 linq 查询

C#:结构构造函数性能

c# - 如何清除文本框保存的密码和用户名?

php - SQL 查询 : order by length of characters?

mysql - 通过存储过程显示日期

c# - Windows 窗体 ListView 控件中的可扩展组