如何在 lambda 中进行 sql 连接?

2023-12-21

有时,我会偶然发现这个问题:我使用了 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 相交不 B) 并集 (A 相交 B)) https://www.wolframalpha.com/input/?i=((A%20intersect%20not%20B)%20union%20(A%20intersect%20B))

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) https://www.wolframalpha.com/input/?i=(A%20intersects%20B)

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

(A联盟B) https://www.wolframalpha.com/input/?i=(A%20union%20B)

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

对你来说最重要的是知道如何执行INNER JOIN and an OUTER JOIN.

For the 内部联接你用JOIN从 LINQ 像这样:

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

The 外连接你已经在你的例子中展示了。

现在您需要混合您所知道的内容,以获得所需的结果。

例如执行全外连接在 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 })
            );

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

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

A 右外连接无非是一个左外连接您可以像这样交换结果列:

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需要的时候。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 lambda 中进行 sql 连接? 的相关文章

随机推荐

  • 在 Golang 中将表单值分配给结构体

    我正在 Golang 中开发 API Rest 我正在使用 Gorm 所以我有代表数据库表的结构 在Create我收到一个带有值的表格 但现在我怀疑如何立即将所有值分配给结构 因为我有一个包含 500 个字段的表 并且我无法逐一进行分配 我
  • 如何在 woocommerce 中获得免费送货的最低订单金额

    我如何获取获得免费送货所需的最低订单金额 woocommerce free shipping min amount在 woocommerce 的管理面板 woocommerce gt 设置 gt 送货 gt 免费送货 gt 最低订单金额 中
  • Ehcache 2 maven依赖

    在我的 pom 中 我有 ehcache 2 依赖项
  • 将 SASS/SCSS 与 Django 集成

    我想将 SASS SCSS 与 Django 应用程序一起使用 我点击了链接https bitbucket org synic django sass https bitbucket org synic django sass 我使用 su
  • 从 C 中的 char* 数组中删除空格

    我正在开发一个插件C对于游戏模拟器 我想在检查输入消息是否包含任何网站网址之前删除聊天消息中的所有空格 所以 我有这样的函数来消除空白 从输入消息中删除空格 char deblank char input int i j char outp
  • 当Android应用程序关闭/设置为后台时如何执行后台任务?

    我的 Android 4 应用程序连接到自定义 Web 服务 用于每隔几分钟同步一次数据 为了确保在线数据始终是最新的 我想在应用程序关闭 发送到后台时触发同步 在 iOS 下这很简单 听applicationDidEnterBackgro
  • 如何将 CloudML Alpha 模型转换为 SavedModel?

    在CloudML在线预测服务的alpha版本中 导出模型的格式为 inputs x x y bytes y g add to collection inputs json dumps inputs outputs a a b bytes b
  • Zabbix JMX Tomcat监控

    我一直在尝试设置 Zabbix 来监控 2 台不同的 Amazon EC2 机器上的 2 台 tomcat 服务器 但没有成功 主机上的 Z 为绿色 但 JMX 为红色并出现这些错误 ZBX TCP READ 失败 4 系统调用中断 其他错
  • 在调整应用程序窗口大小之前,jPanel 不会刷新

    我的 jPanel 有一个问题 我有一个按钮 它从字符串输入 数学公式 中输入 PNG 图像 然后它将在 jPanel 中重新绘制旧图像 问题就来了 图像已更改 但 jPanel 不会重新绘制 直到我手动调整应用程序窗口的大小 看起来面板在
  • 一旦会话过期,Spring MVC 将用户重定向到登录页面

    我在会话中存储了一个用户 bean SessionAttributes UserBean 在我的控制器中 我的目标是在会话过期时将用户重定向到登录 错误页面 以下是我的代码片段 RequestMapping value searchOppo
  • 从 .CSV 文件中选择特定范围的列[重复]

    这个问题在这里已经有答案了 我有一个包含 78000 列的 CSV 文件 我正在尝试选择第 2 100 102 200 列和最后 300 列 其余列需要跳过 我使用 numpy loadtxt 来选择列范围 numpy loadtxt in
  • SignalR 和 .NET 客户端在 ASP.NET WebForms 页面上不起作用

    我尝试在 NET 4 下的 WebForms 应用程序中为仪表板构建通知 我已经下载了 SignalR 版本 1 2 net 客户端和服务器 并准备了一个简单的通知示例 不幸的是它不起作用 我不明白为什么 如果我输入http myserve
  • 如何使用 telnet 测试我的 LDAP 服务器 URL

    我的本地和远程都有一个 LDAP 服务器 我可以 telnet 到本地 ldap url 但无法 telnet 到远程 telnet www ilovebears com 389我得到一个空屏幕 光标闪烁 这是因为某些套接字配置还是端口不可
  • Android getIntent().getExtras() 返回 null

    我正在尝试在两个活动之间传递一个字符串 我已经在其他项目中使用相同的方法完成了此操作 但由于某种原因 当我调用intent getStringExtra String 时 我收到了NullPointerException 我还尝试通过以下方
  • 使用正则表达式验证十六进制字符串

    我正在使用正则表达式验证字符串是否为十六进制 我使用的表达是 A Fa f0 9 当我使用这个时 字符串AABB10被识别为有效的十六进制 但字符串10AABB被认定为无效 我该如何解决这个问题 您很可能需要一个 so regex a fA
  • ChartJs自定义工具提示位置

    那里 我使用 ChartJS 并自定义工具提示 但第一个和最后一个工具提示的位置有问题 看 I suppose that in order to fix the problem I need to use the https www cha
  • 有没有办法在 C++ 中延迟初始化成员变量(类)?

    我有 Java 背景 我有以下程序 include
  • 在 Java 中强制释放大缓存对象

    我使用一个大型 数百万 条目哈希图来缓存算法所需的值 键是两个对象的组合作为一个长 由于它不断增长 因为映射中的键发生变化 因此不再需要旧的键 因此能够强制擦除其中包含的所有数据并在执行期间重新开始会很好 有没有一种方法可以有效地做到这一点
  • 是否有元组的 zipWith 类似物?

    初步说明 这是SeanD 删除的问题 https stackoverflow com q 50020370 2751851 就像有一样zipWith对于列表 GHCi gt zipWith 1 2 3 4 4 6 感觉应该有一些类似于元组的
  • 如何在 lambda 中进行 sql 连接?

    有时 我会偶然发现这个问题 我使用了 lambda 连接的子集 鉴于我可以使用任何 LINQ 扩展 我应该如何实现以下连接 为了简单起见 表定义为 CREATE TABLE dbo TableA Key INT IDENTITY 1 1 N