调优数据库查询Razor页面.NET和EF Core中的脚手架

问题描述

是否有一种方法可以优化由Razor Pages中的Scaffolding生成的即用型代码生成数据库查询?以下是背景信息:

我有两个表:待办事项/任务和类别。任务已分配到类别,因此从任务到类别都有一个FK。

相应的模型文件

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; }
    }

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

但是,我们发现在“待办事项详细信息”和“编辑”页面上,仅类别ID和名称字段是必填字段。 “待办事项”页面不需要“类别”的任何其他字段(例如DummyData)。 但是,生成sql在两个表上进行了INNER JOIN操作,并且包括了所有字段

Display of Todo

生成的相应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]列是不必要的。 “托多编辑”表单也是如此。有没有一种方法可以以最小的努力来调整行为,以使完整的字段/列列表不用于仅需要ID + display列的“查找”操作?

解决方法

您可以简单地通过使用“ new”运算符并从所需对象中选择属性来做到这一点:

Linq语句:

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

SQL生成:

enter image description here