如何在lambda中进行sql连接?

我不时地偶然发现这个问题,我使用了lambda连接的子集。 鉴于我可以使用任何LINQ扩展,我应该如何实现以下连接:

在此处输入图像描述

为简单起见,表格定义为

CREATE TABLE [dbo].[TableA] ( [Key] INT IDENTITY (1, 1) NOT NULL, [Value] NVARCHAR (MAX) NULL, CONSTRAINT [PK_TableA] PRIMARY KEY CLUSTERED ([Key] ASC) ); CREATE TABLE [dbo].[TableB] ( [Key] INT IDENTITY (1, 1) NOT NULL, [Value] NVARCHAR (MAX) NULL, CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED ([Key] ASC) ); 

或者如果您首先喜欢代码

 public class TableContext : DbContext { public DbSet TableB { get; set; } public DbSet TableA { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(ConnectionString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().Property(o => o.Key).UseSqlServerIdentityColumn(); modelBuilder.Entity().Property(o => o.Key).UseSqlServerIdentityColumn(); } } public class B : IKeyValue { public int Key { get; set; } public string Value { get; set; } } public class A : IKeyValue { public int Key { get; set; } public string Value { get; set; } } public interface IKeyValue { int Key { get; set; } string Value { get; set; } } 

作为我的努力

((A交叉而非B)联合(A交叉B))

在此处输入图像描述

 var leftOuterJoin = TableA .GroupJoin( TableB, a => a.Key, b => b.Key, (x, y) => new { TableA = x, TableA = y }) .SelectMany( x => x.TableB.DefaultIfEmpty(), (x, y) => new { TableA = x.TableA, TableB = y}); 

(A与B相交)

在此处输入图像描述

 var innerJoin = TableA .Join( TableB, a => a.Key, b => b.Key, (x, y) => x) 

(工会B)

在此处输入图像描述

 var fullOuterJoin = TableA .FullOuterJoin( TableB, a => a.Key, b => b.Key, (x, y, Key) => new {x, y}) 

对你来说最重要的是知道如何执行INNER JOINOUTER JOIN

对于INNER JOIN,您可以使用LINQ中的JOIN ,如下所示:

内部联接

 var result = TableA .Join(TableB, left => left.Id, right => right.ForeignKeyToTableA, (left, right) => new { TableAColumns = left, TableBColumns = right }); 

您已在示例中显示的OUTER JOIN

现在你需要混合你所知道的,以获得理想的结果。

例如,要执行FULL OUTER JOIN,请在LINQ中执行类似此伪代码的操作:

 SELECT TableA.*, TableB.* FROM TableA LEFT OUTER JOIN TableB UNION SELECT TableA.*, TableB.* FROM TableB LEFT OUTER JOIN TableA 

完全外部加入

这将在LINQ中如下:

 var fullOuterJoin = ( TableA .GroupJoin(TableB, left => left.Id, right => right.ForeignKeyId, (left, right) => new { TableA = left, TableB = right }) .SelectMany(p => p.TableB.DefaultIfEmpty(), (x, y) => new { TableA = x.TableA, TableB = y }) ) .Union ( TableB .GroupJoin(TableA, left => left.Id, right => right.ForeignKeyId, (left, right) => new { TableA = right, TableB = left }) .SelectMany(p => p.TableA.DefaultIfEmpty(), (x, y) => new { TableA = y, TableB = x.TableB }) ); 

然后,您图像的最后一个示例是:

带有空值的FULL OUTER JOIN

 var fullOuterJoinOnlyWithNulls = fullOuterJoin .Where(p => p.TableA == null || p.TableB == null); 

RIGHT OUTER JOIN只是一个LEFT OUTER JOIN ,您可以像这样交换结果列:

在此处输入图像描述

 var rightOuterJoin = ( TableB .GroupJoin(TableA, left => left.Id, right => right.ForeignKeyId, (left, right) => new { TableA = right, TableB = left }) .SelectMany(p => p.TableA.DefaultIfEmpty(), (x, y) => new { TableA = y, TableB = x.TableB }) ); 

像这样你可以构建所有的示例场景。 只需在需要时检查表是否为null