如何在实体框架中的两个表之间进行左连接操作时从左表中选择唯一行

Posted

技术标签:

【中文标题】如何在实体框架中的两个表之间进行左连接操作时从左表中选择唯一行【英文标题】:How to select unique rows from left table while doing left join operation between two tables in Entity Framework 【发布时间】:2022-01-01 02:23:58 【问题描述】:

我有两个表,表 A(loan_id,amount)和表 B(id,loan_id)。现在我想从表A中选择表B中没有loan_id的行。例如

Table A has following rows:
loan_id   amount
-------   ------
1         200
2         400

Table B has following rows:
id     loan_id
--     -------
1      2

在上面的场景中,我想根据loan_id加入这个表并只显示表B中不可用的那些行。我希望输出应该如下所示

 output:
loan_id   amount
-------   ------
1         200

如何使用实体框架来实现这一点。到目前为止,我知道我需要执行左连接并选择那些 B.id == null 的行,但是,我没有找到如何使用 c#、linq 执行此操作。

编辑:

在这里我还添加了我的实体类:

[Table("loans")] ( in my given scenario this is table A)
public class Loan

    [Column("loan_id")]
    public int Id  get; set; 
    [Column("funding_amount")]
    public decimal FundingAmount  get; set; 


[Table("loan_approves")] (in my given scenario this is table B)
public class LoanApprove

    [Column("id")]
    public int Id  get; set; 
    [Column("loan_id")]
    public int LoanId  get; set; 

【问题讨论】:

你的实体是什么样的,它们之间有什么样的关系? loan_id 是表 A 中表 B 的外键。 发布课程,而不是描述。 我用实体类编辑了我的问题。你能再看看吗。 【参考方案1】:

您的查询应如下所示:

var result = context.Loan
   .Where(l => !context.LoanApprove.Any(a => a.LoanId == l.Id))
   .ToList();

NOT IN

var result = context.Loan
   .Where(l => !context.LoanApprove.Select(a => a.LoanId).Contains(l.Id))
   .ToList();

【讨论】:

效果很好!!!【参考方案2】:

由于您没有提供实体类的详细信息,因此这只是一个猜测:

假设你有:

class TableA

    public int LoanId  get; set; 
    public decimal Amount  get; set; 
    public List<TableB> TableBs  get; set; 


class TableB

    public int Id  get; set; 
    public int LoanId  get; set; 
    public TableA Loan  get; set; 

那么你只需要使用:

var result = context.TableAs.Where(a => !a.TableBs.Any()).ToList();

【讨论】:

我想使用 linq/entity 框架执行这个 sql 操作:SELECT * FROM A WHERE id NOT IN (SELECT id FROM B);

以上是关于如何在实体框架中的两个表之间进行左连接操作时从左表中选择唯一行的主要内容,如果未能解决你的问题,请参考以下文章

当我进行左连接时,我仍然无法从左表中获取数据?

sql server 表连接

两个表进行左连接(LEFT JOIN ) 如何只显示右表中为空值的记录行,左表与右表存在关联的记录不显示。

MySQL数据库之连接查询

在Birt报告中获取左边的重复行

从左表返回所有行,从右表返回不同的匹配行