我正在将我的项目从带有 netcoreapp2.0 的 Microsoft.EntityFrameworkCore.SqlServer 2.0.0 升级到带有 net7.0 的 7.0.0
我的代码基准:
对于 2.0.0:
[MemoryDiagnoser]
public class EF2BenchMark
{
[Benchmark]
public async Task RunAsync()
{
using (var context = new Context(""))
{
var query = context.Customers.Where(x => !x.Deleted.HasValue);
query = query.Where(x => x.PrimaryEmail == "[email protected]");
query = query
.Include(x => x.Permission)
.Include(x => x.UserIds);
query = query
.Include(x => x.CustomerProfiles).ThenInclude(x => x.Address)
.Include(x => x.CustomerProfiles).ThenInclude(x => x.Index)
.Include(x => x.CustomerProfiles).ThenInclude(x => x.CustomerValue);
query = query.Include(x => x.ClassProfile).ThenInclude(x => x.Bags)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubShaftLength)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubShaftFlex)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubCategoryType)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.FaceLoftAdjustment)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.FaceLieAdjustment)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubLoft)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubCategory)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.Brand)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.Model);
query = query.Include(x => x.ClassProfile.TimePlayingGolf)
.Include(x => x.ClassProfile.NewHandicap)
.Include(x => x.ClassProfile.CurrentIronLength)
.Include(x => x.ClassProfile.CurrentDriverFlex)
.Include(x => x.ClassProfile.DriverLoft)
.Include(x => x.ClassProfile.CurrentIronLie)
.Include(x => x.ClassProfile.DesiredDriverFlex)
.Include(x => x.ClassProfile.ClubHand);
var customer = await query.FirstOrDefaultAsync();
}
}
}
结果:
对于 7.0.3:
[MemoryDiagnoser]
public class EF7BenchMark
{
[Benchmark]
public async Task RunAsync()
{
var builder = new DbContextOptionsBuilder();
builder.UseModel(ApplicationDbContextModel.Instance);
builder.EnableSensitiveDataLogging();
builder.UseSqlServer("")
.UseLoggerFactory(new LoggerFactory(new[] {
new Microsoft.Extensions.Logging.Debug.DebugLoggerProvider()
}));
using (var context = new ApplicationDbContext(builder.Options))
{
var query = context.Customers.Where(x => !x.Deleted.HasValue);
query = query.Where(x => x.PrimaryEmail == "[email protected]");
query = query
.Include(x => x.MyTmPermission)
.Include(x => x.TmUserIds);
query = query
.Include(x => x.CustomerProfiles).ThenInclude(x => x.Address)
.Include(x => x.CustomerProfiles).ThenInclude(x => x.Index)
.Include(x => x.CustomerProfiles).ThenInclude(x => x.CustomerValue);
query = query.Include(x => x.ClassProfile).ThenInclude(x => x.Bags)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubShaftLength)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubShaftFlex)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubCategoryType)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.FaceLoftAdjustment)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.FaceLieAdjustment)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubLoft)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.ClubCategory)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.Brand)
.Include(x => x.ClassProfile.Bags)
.ThenInclude(x => x.Model);
query = query.Include(x => x.ClassProfile.TimePlayingGolf)
.Include(x => x.ClassProfile.NewHandicap)
.Include(x => x.ClassProfile.CurrentIronLength)
.Include(x => x.ClassProfile.CurrentDriverFlex)
.Include(x => x.ClassProfile.DriverLoft)
.Include(x => x.ClassProfile.CurrentIronLie)
.Include(x => x.ClassProfile.DesiredDriverFlex)
.Include(x => x.ClassProfile.ClubHand);
var customer = await query.AsSplitQuery().AsNoTrackingWithIdentityResolution().FirstOrDefaultAsync();
}
}
}
结果:
构建到 SQL 的查询与我使用 SQL Profiler 时相同。 我在性能上做错了什么?这是同一个查询。 我可以做些什么来提高 ef core 7.0.3 的性能?