如何使用基于 SQL Query 的连接在 C# 中编写 LINQ?
Posted
技术标签:
【中文标题】如何使用基于 SQL Query 的连接在 C# 中编写 LINQ?【英文标题】:How to write LINQ in C# with joins based on SQL Query? 【发布时间】:2021-08-15 18:35:34 【问题描述】:我需要根据以下查询编写一个 linq。
在 SQL Server 中,
select EXID,ID,NAME
from Table1 A
join Table2 B on A.BXID = B.BID
left outer join Table3 C ON C.AXID = A.ID
AND C.EXID = (some number/NULL)
这给了我 300 条记录
在 LINQ 中,
try
using (var context = new cltransformationContext())
var Details = (
from A in context.Table1
join B in context.Table2 on A.BXID equals B.BID
join C in context.Table3 on A.ID equals C.AXID
select new Table1()
ID = A.ID,
name = A.NAME + '-' B.Name
).ToList();
return Details;
我在这里获得了 5000 条记录。
我错过了 left outer join 和 C.EXID = (some number/NULL) 条件。 如何在查询中做到这一点?
我应该只得到 300 条记录。
【问题讨论】:
您缺少 AND。 在 c# 中无法做到这一点。我们如何添加这个条件? 在 context.Table3.Where(x => x.EXID == 123) 中加入 C 【参考方案1】:此查询将创建 LEFT JOIN:
var query =
from A in context.Table1
join B in context.Table2 on A.BXID equals B.BID
from C in context.Table3.Where(C => A.ID == C.AXID && C.EXID == ...).DefaultIfEmpty()
select new Table1
ID = A.ID,
name = A.NAME + '-' B.Name
;
【讨论】:
很少出现错误 - 表达式术语“选择”无效,预期上下文关键字“on”,预期上下文关键字“等于” 我已将join
替换为from
。可能你错过了。【参考方案2】:
应该这样做
var query =
from A in context.Table1
join B in context.Table2 on A.BXID equals B.BID
join table3 in context.Table3.Where(X => x.EXID = 123) on A.ID == table3.AXID into table3Joined
from C in table3Joined.DefaultIfEmpty() // this is how we do the left join
select new Table1
ID = A.ID,
name = A.NAME + '-' B.Name
;
复杂性在于我们必须将连接放入table3Joined
,然后我们才能做到from C in table3Joined.DefaultIfEmpty()
【讨论】:
以上是关于如何使用基于 SQL Query 的连接在 C# 中编写 LINQ?的主要内容,如果未能解决你的问题,请参考以下文章
在 C# 中更改 Excel Power Query 连接字符串
如何在 C# 中连接 SQL 并使用 Adapter 的命令
如何建立数据库(sql)连接以使用 c# 从文本字段接收数据?