Hai lý do, một về hiệu năng và một về hợp đồng API.
Hiệu năng: trả entity buộc EF SELECT toàn bộ cột, kể cả Description dài hay cột byte[] không ai dùng. Projection sinh SQL chỉ lấy cột cần và không đưa entity vào change tracker, nên nhẹ hơn hẳn.
csharp
var items = await db.Orders
.Where(o => o.CustomerId == id)
.Select(o => new OrderSummaryDto(o.Id, o.Total, o.Customer.Name))
.ToListAsync();Hợp đồng API: entity là mô hình của DB, DTO là mô hình của API. Trả entity làm rò rỉ cột nội bộ (PasswordHash, IsDeleted, khoá ngoại) và biến mọi thay đổi schema thành breaking change cho client. Ngoài ra navigation property hai chiều dễ gây vòng lặp khi serialize JSON.
Lưu ý: projection cho ra object không được track, nên chỉ hợp cho luồng đọc. Khi cần cập nhật thì query entity bình thường.