【发布时间】:2016-04-27 06:54:18
【问题描述】:
我有时会偶然发现这个问题,即我使用了 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<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(),
(x, y) => new { TableA = x.TableA, TableB = y});
var innerJoin = TableA
.Join(
TableB,
a => a.Key,
b => b.Key,
(x, y) => x)
var fullOuterJoin = TableA
.FullOuterJoin(
TableB,
a => a.Key,
b => b.Key,
(x, y, Key) => new {x, y})
【问题讨论】:
-
好吧,你尝试过任何东西了吗?做过研究吗?提示:LINQ
Join操作是内连接。 -
@JonSkeet 我曾考虑添加我的示例,但我认为它会平衡给出答案的方式。
-
现在这个问题看起来很像“为我做作业”。我敢说这不是作业,但这不是一个好的堆栈溢出问题。
-
您以正确的顺序使用 Join、Left Join、except 和 union 的组合。或者,如果您正在使用 IEnumerables,则可以对其中的大多数使用 github.com/morelinq/MoreLINQ。