面试题答案
一键面试1. 配置Entity Framework上下文
- 安装Entity Framework NuGet包:
在项目中通过NuGet包管理器安装
Microsoft.EntityFrameworkCore
及其相关数据库提供程序(如Microsoft.EntityFrameworkCore.SqlServer
用于SQL Server数据库)。 - 创建DbContext:
using Microsoft.EntityFrameworkCore;
public class YourDbContext : DbContext
{
public YourDbContext(DbContextOptions<YourDbContext> options) : base(options)
{
}
public DbSet<Table1> Table1s { get; set; }
public DbSet<Table2> Table2s { get; set; }
// 其他DbSet属性对应其他表
}
- 在Startup.cs中注册DbContext:
using Microsoft.EntityFrameworkCore;
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<YourDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("YourConnectionString")));
}
2. 构建查询语句并分页
- 使用Include方法处理多表关联:
假设
Table1
与Table2
通过外键关联,Table1
中有一个Table2Id
字段。
using System.Linq;
using Microsoft.EntityFrameworkCore;
public async Task<PageResult<Table1ViewModel>> GetPagedData(int pageNumber, int pageSize)
{
using var context = new YourDbContext();
var query = context.Table1s
.Include(t1 => t1.Table2NavigationProperty) // 假设导航属性名为Table2NavigationProperty
.AsQueryable();
var totalCount = await query.CountAsync();
var data = await query
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.Select(t1 => new Table1ViewModel
{
// 映射属性
Table1Property = t1.Table1Property,
Table2Property = t1.Table2NavigationProperty.Table2Property
})
.ToListAsync();
return new PageResult<Table1ViewModel>
{
Data = data,
TotalCount = totalCount
};
}
public class PageResult<T>
{
public List<T> Data { get; set; }
public int TotalCount { get; set; }
}
3. 性能优化
- 索引优化:
- 确保在关联字段上(如
Table1
中的Table2Id
)创建索引。在数据库中,可以使用CREATE INDEX
语句创建索引。 - 对于经常用于过滤、排序的字段也应创建合适的索引。
- 确保在关联字段上(如
- 投影优化:
- 仅选择需要的字段,避免选择所有字段(
SELECT *
)。在上述代码中,通过Select
方法映射到视图模型只选择了需要的属性。
- 仅选择需要的字段,避免选择所有字段(
- 启用延迟加载:
- 可以在DbContext中配置延迟加载,但是要注意性能影响,避免过多的数据库往返。例如:
public class YourDbContext : DbContext
{
public YourDbContext(DbContextOptions<YourDbContext> options) : base(options)
{
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseLazyLoadingProxies();
}
// 其他代码
}
- 缓存机制:
- 如果数据变化不频繁,可以考虑使用缓存。例如使用Redis缓存查询结果。在获取数据前先检查缓存中是否存在数据,如果存在则直接返回缓存数据,否则执行数据库查询并将结果缓存起来。
以上代码示例以C#和Entity Framework Core为例,不同数据库和框架版本可能略有差异。