diff --git "a/\351\273\204\346\267\274\346\236\227/20260608-\347\273\274\345\220\210\344\270\232\345\212\241\344\270\216\345\210\206\351\241\265.md" "b/\351\273\204\346\267\274\346\236\227/20260608-\347\273\274\345\220\210\344\270\232\345\212\241\344\270\216\345\210\206\351\241\265.md" new file mode 100644 index 0000000000000000000000000000000000000000..f6dd7ac096646d1a203dee7b5c52dee778c98db0 --- /dev/null +++ "b/\351\273\204\346\267\274\346\236\227/20260608-\347\273\274\345\220\210\344\270\232\345\212\241\344\270\216\345\210\206\351\241\265.md" @@ -0,0 +1,43 @@ +## Include 和投影两种查关联数据的方式 + +### 方式 1:Include 显式加载 +```js +var product = await _db.Products + .Include(p => p.Category) + .FirstOrDefaultAsync(p => p.Id == 1); + +// 完整实体 +Console.WriteLine(product.Name); // iPhone 15 +Console.WriteLine(product.Category!.Name); // 电子产品 +EF Core 翻译成: + +SELECT p.*, c.* +FROM Products p +INNER JOIN Categories c ON p.CategoryId = c.Id +WHERE p.Id = 1; +``` +特点:返回完整实体,所有字段都加载,Change Tracking 跟踪全部属性。 + +### 方式 2:投影 Select +```js +var dto = await _db.Products + .Where(p => p.Id == 1) + .Select(p => new ProductDto + { + Id = p.Id, + Name = p.Name, + Price = p.Price, + Stock = p.Stock, + CategoryId = p.CategoryId, + CategoryName = p.Category!.Name + }) + .FirstOrDefaultAsync(); + +EF Core 翻译成: + +SELECT p.Id, p.Name, p.Price, p.Stock, p.CategoryId, c.Name AS CategoryName +FROM Products p +INNER JOIN Categories c ON p.CategoryId = c.Id +WHERE p.Id = 1; +``` +特点:只 SELECT 需要的列,性能更好;返回 DTO,不进 Change Tracking。 \ No newline at end of file