为 Razor Pages(.NET 和 EF Core)中的脚手架调整数据库查询

Tune DB queries for Scaffolding in Razor Pages (.NET and EF Core)

有没有办法优化由 Razor Pages 中的脚手架生成的开箱即用代码生成的数据库查询?这是背景信息:

我有两个表:ToDos/Tasks 和类别。任务分配给类别,因此存在从任务到类别的外键。

对应的模型文件:

public partial class Category
{
    public Category()
    {
        Tasks = new HashSet<Todo>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string DummyData { get; set; }

    public virtual ICollection<Todo> Tasks { get; set; }
}
public partial class Todo
    {
        public int Id { get; set; }
        public string Description { get; set; }
        [DataType(DataType.Date)]
        public DateTime? DueDate { get; set; }
        public int CategoryId { get; set; }

        public virtual Category Category { get; set; }
    }

一切都是由脚手架生成的,没有自定义代码。应用程序运行良好。

但是我们观察到在 Todo 详细信息和编辑页面上,只有类别 ID 和名称字段是必需的。 ToDo 页面不需要属于类别的任何其他字段(例如 DummyData)。 但是生成的 SQL 对两个表进行了 INNER JOIN,所有字段都包含在内

对应SQL生成:

SELECT [t].[Id], [t].[categoryID], [t].[Description], [t].[DueDate], [c].[Id], [c].[DummyData], [c].[Name]
FROM [Tasks] AS [t]
INNER JOIN [Categories] AS [c] ON [t].[categoryID] = [c].[Id]

此处[c].[DummyData]栏是不必要的。 Todo Edit 表单也是如此。有没有办法以最小的努力调整行为,以便完整的 field/Column 列表不用于只需要 ID+显示列的“查找”操作?

您只需使用“新建”运算符并从我们需要的对象中选择属性即可:

Linq 语句:

var result = _context.Todos
                .Select(t => new
                {
                    t.CategoryId,
                    t.Description,
                    t.DueDate,
                    t.Category.Name
                }).ToList();

SQL 生成: