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