为 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 生成:
有没有办法优化由 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 生成: