时序数据库QuestDB在Winform窗体应用

发布于:2025-03-24 ⋅ 阅读:(28) ⋅ 点赞:(0)

以下是QuestDB在Winform使用的代码:
//初始化
private void Init()
{
//创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = “host=10.3.5.227;port=8812;username=admin;password=quest;database=qdb;ServerCompatibilityMode=NoTypeLoading;”,
DbType = SqlSugar.DbType.QuestDB,
IsAutoCloseConnection = true
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
};
//注意多租户 有几个设置几个
//db.GetConnection(i).Aop
});
//建库
//建表
Db.CodeFirst.InitTables(); //所有库都支持
//插入数据
Db.Insertable(new Student() { Name = “jack”, SchoolId = 1 }).ExecuteCommand();
//查询数据
Expression<Func<Student, bool>> expression = it => it.Dt < DateTime.Now && it.SchoolId == 1;
expression = expression.And(x => x.SchoolId==1);
var list = Db.Queryable().Where(expression).ToList();
MessageBox.Show(list.Count.ToString());
}
//按钮
private void button1_Click(object sender, EventArgs e)
{
Init();
}
}
//实体与数据库结构一样
public class Student
{
//数据是自增需要加上IsIdentity
//数据库是主键需要加上IsPrimaryKey
//注意:要完全和数据库一致2个属性
[SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
public int Id { get; set; }
public int? SchoolId { get; set; }
public string Name { get; set; }
[SugarColumn(IsOnlyIgnoreUpdate = true)]
public DateTime Dt { get; set; }
}
//And扩展类
public static class ExpressionFuncExtender
{
private static Expression Compose(this Expression first, Expression second,
Func<Expression, Expression, Expression> merge)
{
// build parameter map (from parameters of second to parameters of first)
var map = first.Parameters.Select((f, i) => new { f, s = second.Parameters[i] })
.ToDictionary(p => p.s, p => p.f);
// replace parameters in the second lambda expression with parameters from the first
var secondBody = ParameterRebinder.ReplaceParameters(map, second.Body);
// apply composition of lambda expression bodies to parameters from the first expression
return Expression.Lambda(merge(first.Body, secondBody), first.Parameters);
}
///
/// Combines two given expressions by using the AND semantics.
///
/// The type of the object.
/// The first part of the expression.
/// The second part of the expression.
/// The combined expression.
public static Expression<Func<T, bool>> And(this Expression<Func<T, bool>> first,
Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.AndAlso);
}
///
/// Combines two given expressions by using the OR semantics.
///
/// The type of the object.
/// The first part of the expression.
/// The second part of the expression.
/// The combined expression.
public static Expression<Func<T, bool>> Or(this Expression<Func<T, bool>> first,
Expression<Func<T, bool>> second)
{
return first.Compose(second, Expression.OrElse);
}
}
internal class ParameterRebinder : ExpressionVisitor
{
private readonly Dictionary<ParameterExpression, ParameterExpression> _map;
internal ParameterRebinder(Dictionary<ParameterExpression, ParameterExpression> map)
{
_map = map ?? new Dictionary<ParameterExpression, ParameterExpression>();
}
internal static Expression ReplaceParameters(Dictionary<ParameterExpression, ParameterExpression> map,
Expression exp)
{
return new ParameterRebinder(map).Visit(exp);
}
protected override Expression VisitParameter(ParameterExpression p)
{
if (_map.TryGetValue(p, out var replacement))
{
p = replacement;
}
return base.VisitParameter§;
}


网站公告

今日签到

点亮在社区的每一天
去签到