From c983d7905e31e6df8ec42b06e81825c6b4fb37a7 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@users.noreply.github.com> Date: Fri, 12 Dec 2025 21:29:55 +0800 Subject: [PATCH] =?UTF-8?q?Updated=20=E5=A4=9A=E8=A1=A8=E6=9F=A5=E8=AF=A2?= =?UTF-8?q?=20(markdown)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 多表查询.md | 36 +++++++++++++++++------------------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/多表查询.md b/多表查询.md index c7d3af5..7d5f9b2 100644 --- a/多表查询.md +++ b/多表查询.md @@ -76,29 +76,27 @@ fsql.Select() > 经验:[一对多,分表只取最后一条记录](https://github.com/dotnetcore/FreeSql/issues/430) -## 3、WithSql +## 3、WithoutJoin + +`WithoutJoin()` 方法提供了一种强大的机制,用于在 FreeSql 的多表查询(例如 `fsql.Select()`)中,**严格地控制哪些泛型类型对应的表最终会被 JOIN 到生成的 SQL 语句中**。这使得你可以在应用程序层面精确地动态构建查询,替代传统手动拼接 SQL 中对 JOIN 子句的条件控制。 ```csharp -fsql.Select() - .WithSql( - "select * from Topic where id=@id1", - "select * from Category where id=@id2", - null, //不设置 CategoryType 对应的 SQL - new { id1 = 10, id2 = 11, id3 = 13 } - ) - .LeftJoin((a,b,c) => a.CategoryId == b.Id) - .LeftJoin((a,b,c) => b.ParentId == c.Id) - .ToList(); -//SELECT ... -//FROM ( select * from Topic where id=@id1 ) a -//LEFT JOIN ( select * from Category where id=@id2 ) b ON a.`CategoryId` = b.`Id` -//LEFT JOIN `CategoryType` c ON b.`ParentId` = c.`Id` +fsql.Select() + .InnerJoin((o, p, u) => o.UserId == u.Id) + .LeftJoin((o, p, u) => o.ProductId == p.Id) + .WithoutJoin(t2: !includeProductInfo) + .ToList((o, p, u) => new OrderDetailDto + { + OrderId = o.Id, + OrderNo = o.OrderNo, + Username = u.Username, // User (T3) 始终 JOIN,可直接引用 + ProductName = includeProductInfo ? p.Name : "N/A" + }); + +// includeProductInfo = true: SQL 将 JOIN Product +// includeProductInfo = false: SQL 将不 JOIN Product,ProductName 会是 "N/A" ``` -> 提示:ISelect.ToSql 可与 WithSql 配合使用 - -> v3.2.666 [WithTempQuery + FromQuery 嵌套查询](%e5%b5%8c%e5%a5%97%e6%9f%a5%e8%af%a2) - ## 4、SQL联表 ```csharp fsql.Select()