using BenchmarkDotNet.Attributes;
using Dapper;
using Microsoft.Data.SqlClient;
using PerformanceBenchmarks.Entities;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
namespace PerformanceBenchmarks.Benchmarks
{
///
/// Complex query benchmarks for SqlSugar
/// SqlSugar 复杂查询基准测试
///
[MemoryDiagnoser]
[RankColumn]
public class ComplexQueryBenchmarks
{
private SqlSugarClient _sqlSugarDb;
private SqlConnection _dapperConnection;
///
/// Setup method called before benchmarks
/// 基准测试前调用的设置方法
///
[GlobalSetup]
public void Setup()
{
BenchmarkConfig.InitializeDatabase();
BenchmarkConfig.CleanupDatabase();
_sqlSugarDb = BenchmarkConfig.GetSqlServerDb();
_dapperConnection = new SqlConnection(BenchmarkConfig.SqlServerConnection);
_dapperConnection.Open();
InsertTestData();
}
///
/// Cleanup method called after benchmarks
/// 基准测试后调用的清理方法
///
[GlobalCleanup]
public void Cleanup()
{
_dapperConnection?.Close();
_dapperConnection?.Dispose();
BenchmarkConfig.CleanupDatabase();
}
///
/// Insert test data for benchmarks
/// 为基准测试插入测试数据
///
private void InsertTestData()
{
var customers = new List();
for (int i = 1; i <= 100; i++)
{
customers.Add(new BenchmarkCustomer
{
CustomerName = $"Customer {i}",
Email = $"customer{i}@test.com",
Phone = $"123-456-{i:D4}",
Address = $"{i} Main Street",
City = i % 3 == 0 ? "CityA" : (i % 3 == 1 ? "CityB" : "CityC"),
Country = "TestCountry",
RegistrationDate = DateTime.Now.AddDays(-i),
IsActive = i % 2 == 0
});
}
_sqlSugarDb.Insertable(customers).ExecuteCommand();
var products = new List();
for (int i = 1; i <= 50; i++)
{
products.Add(new BenchmarkProduct
{
ProductName = $"Product {i}",
ProductCode = $"PRD{i:D5}",
Category = $"Category {i % 5}",
UnitPrice = 10.00m * i,
StockQuantity = 100 * i,
Description = $"Description for product {i}",
IsAvailable = i % 3 != 0,
CreatedDate = DateTime.Now.AddDays(-i)
});
}
_sqlSugarDb.Insertable(products).ExecuteCommand();
var orders = new List();
for (int i = 1; i <= 200; i++)
{
orders.Add(new BenchmarkOrder
{
CustomerId = (i % 100) + 1,
OrderNumber = $"ORD{i:D6}",
OrderDate = DateTime.Now.AddDays(-i),
TotalAmount = 100.00m * i,
Status = i % 3 == 0 ? "Completed" : (i % 3 == 1 ? "Pending" : "Cancelled"),
ShippingAddress = $"{i} Shipping Street",
CreatedDate = DateTime.Now.AddDays(-i)
});
}
_sqlSugarDb.Insertable(orders).ExecuteCommand();
}
///
/// SqlSugar: Subquery
/// SqlSugar: 子查询
///
[Benchmark]
public List SqlSugar_Subquery()
{
return _sqlSugarDb.Queryable()
.Where(c => SqlFunc.Subqueryable()
.Where(o => o.CustomerId == c.CustomerId && o.Status == "Completed")
.Any())
.ToList();
}
///
/// Dapper: Subquery
/// Dapper: 子查询
///
[Benchmark]
public List Dapper_Subquery()
{
var sql = @"SELECT * FROM BenchmarkCustomer c
WHERE EXISTS (
SELECT 1 FROM BenchmarkOrder o
WHERE o.CustomerId = c.CustomerId AND o.Status = @Status
)";
return _dapperConnection.Query(sql, new { Status = "Completed" }).ToList();
}
///
/// SqlSugar: Group by with having
/// SqlSugar: 分组查询带 Having
///
[Benchmark]
public List