c# – 如何在lambda中进行sql连接?
发布时间:2020-12-15 07:47:47 所属栏目:百科 来源:网络整理
导读:我不时地偶然发现这个问题,我使用了lambda连接的子集.鉴于我可以使用任何LINQ扩展,我应该如何实现以下连接: 为简单起见,表格定义为 CREATE TABLE [dbo].[TableA] ( [Key] INT IDENTITY (1,1) NOT NULL,[Value] NVARCHAR (MAX) NULL,CONSTRAINT [PK_TableA]
我不时地偶然发现这个问题,我使用了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,CONSTRAINT [PK_TableB] PRIMARY KEY CLUSTERED ([Key] ASC) ); 或者如果您首先喜欢代码 public class TableContext : DbContext { public DbSet<B> TableB { get; set; } public DbSet<A> TableA { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer(ConnectionString); } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<TableB>().Property(o => o.Key).UseSqlServerIdentityColumn(); modelBuilder.Entity<TableA>().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 intersect not B) union (A intersect B)) var leftOuterJoin = TableA .GroupJoin( TableB,a => a.Key,b => b.Key,(x,y) => new { TableA = x,TableA = y }) .SelectMany( x => x.TableB.DefaultIfEmpty(),y) => new { TableA = x.TableA,TableB = y}); (A intersects B) var innerJoin = TableA .Join( TableB,y) => x) (A union B) var fullOuterJoin = TableA .FullOuterJoin( TableB,y,Key) => new {x,y}) 解决方法
对你来说最重要的是知道如何执行INNER JOIN和OUTER 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,right => right.ForeignKeyId,right) => new { TableA = left,TableB = right }) .SelectMany(p => p.TableB.DefaultIfEmpty(),y) => new { TableA = x.TableA,TableB = y }) ) .Union ( TableB .GroupJoin(TableA,right) => new { TableA = right,TableB = left }) .SelectMany(p => p.TableA.DefaultIfEmpty(),y) => new { TableA = y,TableB = x.TableB }) ); 然后,您图像的最后一个示例是: var fullOuterJoinOnlyWithNulls = fullOuterJoin .Where(p => p.TableA == null || p.TableB == null); 一个正确的外部联接只是一个LEFT OUTER JOIN,您可以像这样交换结果列: var rightOuterJoin = ( TableB .GroupJoin(TableA,y) => new { TableA = y,TableB = x.TableB }) ); 像这样你可以构建所有的示例场景.只需在需要时检查表是否为null. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |