Voy.DALBase 1.0.5

There is a newer version of this package available.
See the version list below for details.
dotnet add package Voy.DALBase --version 1.0.5
                    
NuGet\Install-Package Voy.DALBase -Version 1.0.5
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Voy.DALBase" Version="1.0.5" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Voy.DALBase" Version="1.0.5" />
                    
Directory.Packages.props
<PackageReference Include="Voy.DALBase" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Voy.DALBase --version 1.0.5
                    
#r "nuget: Voy.DALBase, 1.0.5"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Voy.DALBase@1.0.5
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Voy.DALBase&version=1.0.5
                    
Install as a Cake Addin
#tool nuget:?package=Voy.DALBase&version=1.0.5
                    
Install as a Cake Tool

Voy.DALBase Readme

ORM framework for MySql(Will add more) using lambda expressions.

How to use

Instantiate

using System.Data.Common;

DbConnection conn = new MySqlConnection("Server=XXX.XXX.XXX.XXX; Port=XXXX; Database=XXXX; Uid=XXXX; Pwd=XXXXXXXX; SslMode=Preferred;"); 

VDB vdb = new VDB(conn));

Public Methods

MethodName Description CreateDatabase DropDatabase GetDatabaseTables CreateTable DropTable TruncateTable GetTableStructure Insert Delete Update Select
方法名 说明 创建数据库 移除数据库 获取数据库中的表信息 创建数据表 移除数据表 清空数据表 获取数据表结构 插入数据 删除数据 更新数据 查询数据
GetSQLString() 获取SQL语句。 <center><center>✓</center></center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center>
GetParams() 获取SQL语句的参数。 <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center>
Execute() 执行数据操作命令。 <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center> <center>✓</center>
GetData() 执行数据查询命令。 <center>✓</center> <center>✓</center> <center>✓</center>
ExecuteScalar() 执行标量查询命令。 <center>✓</center> <center>✓</center> <center>✓</center>

Insert

//使用Lambda表达式插入数据。
var ins1 = vdb.Insert<User>(u => new User { Name = "张三", Age = 30 });

//使用实体对象插入数据。(可省略<TClass>)
var ins2 = vdb.Insert(new User { Name = "李四", Age = 40 });

//批量插入数据。
var ins3 = vdb.Insert<User>(new List<User>
{
    new User { Name = "刘一", Age = 10, CreateTime = DateTime.Now },
    new User { Name = "陈二", Age = 20, CreateTime = DateTime.Now },
    new User { Name = "王五", Age = 50, CreateTime = DateTime.Now },
    new User { Name = "赵六", Age = 60, CreateTime = DateTime.Now },
    new User { Name = "孙七", Age = 70, CreateTime = DateTime.Now },
    new User { Name = "周八", Age = 80, CreateTime = DateTime.Now },
    new User { Name = "吴九", Age = 90, CreateTime = DateTime.Now },
    new User { Name = "郑十", Age = 100, CreateTime = DateTime.Now },
});
  • 使用方法:Insert<TClass>(),参数不可为空。获取结果方法名称:Execute()。
  • 可以使用:Lambda表达式、实体对象做为参数单次插入一条记录,也可以用List<TClass>型参数批量插入多条记录。
  • 插入一条记录时返回自增主键值。如果主键不是自增长,返回0;插入多条记录时返回影响行数。
  • 可空的属性将插入空值,不可空属性将插入默认值。

Update

//用Lambda表达式更新数据。
var upd1 = vdb.Update<User>(u => new User { Id = 1, Name = "王五", Age = 50 });

//用表达式 + Where方法更新数据。
var upd2 = vdb.Update<User>(u => new User { Name = "赵六", Age = 60 }).Where(u => u.Name == "李四");

//用匿名对象更新数据。
var upd3 = vdb.Update<User>(new { Id = 1, Name = "孙七", Age = 70 });

//用匿名对象更新 + Where方法更新数据。
var upd4 = vdb.Update<User>(new { Name = "周八", Age = 80 }).Where(u => u.Name == "赵六");
  • 使用方法:Update<TClass>(),参数不可为空。获取结果方法名称:Execute()。
  • 可以使用:Lambda表达式、匿名对象作为参数修改一条记录。目前不支持实体对象,使用实体对象将不能成功执行。为了后续版本向前兼容,参数类型持续使用dynamic。
  • 使用匿名对象参数和Where()方法更新记录时可以更新任何列;只使用对象参数更新时,主键字段的值将作为筛选条件不进行更新。
  • 匿名对象参数中与“TClass”中同名的属性,如果带有“DatabaseGeneratedOption.Computed”标签将不会出现在生成的SQL语句中。
  • 匿名对象的列中未包括主键字段,也没有使用Where语句进行更新筛选时,为了数据安全更新操作将不会被执行。

Delete

//用Lambda表达式删除数据。
var del1 = vdb.Delete<User>(u => new User { Id = 1 });

//用Where方法删除数据。
var del2 = vdb.Delete<User>().Where(u => u.Name == "周八");

//用实体对象删除数据。(可省略<TClass>)
var del3 = vdb.Delete(new User() { Name = "周八" });

//用Lambda表达式 + Where方法删除数据。
var del4 = vdb.Delete<User>(u => new User { Id = 1 }).Where(u => u.Name == "周八");

//用实体对象 + Where方法删除数据。
var del5 = vdb.Delete<User>(new User { Id = 1 }).Where(u => u.Name == "周八");
  • 使用方法:Delete<TClass>(),参数可为空。获取结果方法名称:Execute()。
  • 可以使用:Lambda表达式、实体对象做为参数删除记录,也可以用Where方法作为筛选条件删除记录。
  • 使用实体对象为参数筛选记录时,如果对象的属性是数值型的默认值(例如int的0)则无效果,例如不要使用“new User { Age = 0 }”。
  • 有参数,也使用Where语句进行更新筛选时,筛选条件将进行AND合并。
  • 无参数,也没有使用Where语句进行更新筛选时,为了数据安全更新操作将不会被执行。

Select

//获取全部字段
var sel1 = vdb.Select<User>()
    .Where<User>(u => u.Name == "王五")
    .OrderBy(u => u.Id)
    .OrderBy(u => u.Age)
    .Page(1, 10);

//获取指定字段
var sel2 = vdb.Select<User>(u => new { u.Id, u.Name })
    .Where<User>(u => u.Name == "王五")
    .OrderByDesc(u => u.Id)
    .OrderBy(u => u.Age)
    .Page(1, 10);
方法 说明 参数 可使用次数 备注
InnerJoin 联合查询 Lambda表达式 <center>∞</center> 如果表中有至少一个匹配,则返回行。
LeftJoin 左联合查询 Lambda表达式 <center>∞</center> 即使右表中没有匹配,也从左表返回所有的行。
RightJoin 右联合查询 Lambda表达式 <center>∞</center> 即使左表中没有匹配,也从右表返回所有的行。
FullOutJoin Lambda表达式 <center>∞</center> 只要其中一个表中存在匹配,则返回行。
Where 通过属性进行筛选 Lambda表达式 <center>∞</center> 多次使用时,方法之间的筛选条件关系是And。
WhereByBase 通过基类的属性进行筛选 Lambda表达式 <center>∞</center> 用于筛选的类型不确定,又需要使用通用属性(例如约定每个类都有Id)的时候。WhereByBase<TClass, TBase>两个类型参数为必填。
GroupBy 分组 Lambda表达式 <center>∞</center>
OrderBy 升序排序 Lambda表达式 <center>∞</center>
OrderByDesc 降序排序 Lambda表达式 <center>∞</center>
Page 筛选结果的分页 int pageIndex, int pageSize <center>1</center> 引用Total属性获得记录总数。

Operators For Filter(Where Method)

Operator Description Usage example
<center>==</center> u.Name == "张三"
<center>!=</center> u.Name != "张三"
<center><</center> u.Age < 50
<center><=</center> u.Age ⇐ 50
<center>></center> u.Age > 50
<center>>=</center> u.Age >= 50
<center>&&</center> u.Name == "aa" && u.Age == 10
<center> </center> u.Name == "aa" u.Age == 10
<center>StartsWith</center> u.Name.StartsWith("abc")
<center>EndsWith</center> u.Name.EndsWith("abc")
<center>Contains</center> u.Name.Contains("a")\new[] { 1, 2, 3, 4 }.Contains(u.Id)\Enumerable.Contains<int>(new[] { 1, 2, 3, }, u.Age)\Enumerable.Contains<string>(new[] { "张三", "李四" }, u.Name)
  • Methods can also be used multiple times, and the order of use is not required. The relationship between the filter conditions executed by multiple methods is And.方法也可以多次使用,使用顺序无要求。多个方法执行的筛选条件之关系为And。
  • If there is an "OR" relationship, you can use the static method "Tools.ExpressionTools.CreateExpression<T>()" to create more flexible filter conditions as parameters. 如果有“OR”的关系可以使用静态方法“Tools.ExpressionTools.CreateExpression<T>()”来创建更灵活的筛选条件作为参数。For example:
var e1 = ExpressionTools.CreateExpression<User>(u => u.Id == 1 || u.Name.Contains("z"));
var e2 = ExpressionTools.CreateExpression<User>(u => u.Age > 20);

var exp = e1.And(e2);
var v1 = vdb.Select<User>().Where(exp);

Agg

var v1 = vdb.Select<User>()
.SUM(u => u.Age,)
.COUNT(u => u.IsDeleted == 0)
var result = v1.GetData();
方法 说明 参数 可用次数
Avg 计算某个列的平均值。 Lambda表达式 <center>∞</center>
Count 统计集合中的项目数。 Lambda表达式 <center>∞</center>
Max 计算列的最大值。 Lambda表达式 <center>∞</center>
Min 计算列的最小值。 Lambda表达式 <center>∞</center>
Sum 计算列的合计值。 Lambda表达式 <center>∞</center>

About Attribute For Model

Table

Name 说明 Description Usage example Namespace
Table 表示类将映射到的数据库表。 Indicates the database table to which the class will be mapped. [Table("user_team")] System.ComponentModel.DataAnnotations.Schema

Column

Name 说明 Description Usage example Namespace
Column 表示属性将映射到的数据库列。 Indicates the database column to which the attribute will be mapped. [Column("id", Order = 0, TypeName = "int")] System.ComponentModel.DataAnnotations.Schema
Computed 在插入或更新一个行时,数据库会生成一个值。 When a row is inserted or updated, the database generates a value. [DatabaseGenerated(DatabaseGeneratedOption.Computed)] System.ComponentModel.DataAnnotations.Schema
Identity 在插入一个行时,数据库会生成一个值。 Indicates that a property or class should be excluded from database mapping. [DatabaseGenerated(DatabaseGeneratedOption.Identity)] System.ComponentModel.DataAnnotations.Schema
None 数据库不生成值。 Represents one or more properties that uniquely identify an entity. [DatabaseGenerated(DatabaseGeneratedOption.None)] System.ComponentModel.DataAnnotations.Schema
NotMapped 表示应从数据库映射中排除属性或类。 Specifying a data field value is required. [NotMapped] System.ComponentModel.DataAnnotations.Schema
Key 表示唯一标识实体的一个或多个属性。 Represents one or more properties that uniquely identify an entity. [Key] System.ComponentModel.DataAnnotations
Required 指定数据字段值是必需的。 Specifying a data field value is required. [Required] System.ComponentModel.DataAnnotations
DefaultValue 指定属性的默认值。 Specifies the default value for the property. [DefaultValue("CURRENT_TIMESTAMP")] System.ComponentModel
Description 指定属性或事件的说明。 Specifies a description for the property or event. [Description("name")] System.ComponentModel
  • 有Key和Identity标签的int型属性,映射的数据列是自动增长列。

  • Required、Key标识的字段均为必填,无需重复设置。

  • 没有设置Column标签的属性,会根据数据库品牌,用属性名生成相应形式的列名,也会根据属性的数据类型生成相应的列类型及默认最大长度。

  • Identity标签(自动增长)只对int类型的列生效,非int类型列设置DefaultValue后,将忽略Identity标签。

  • 设置了Computed标签的属性映射列,在插入和更新时默认值均会被计算,没有设置Computed的默认值只在插入时计算。

  • 插入数据时如果没有设置必填项的数值,该项目也没有默认值,Insert语句将根据“TypeName”的内容自动增加该项目类型的默认值。如果没有设置TypeName,则会根据属性类型分配最接近的字段类型。

  • 使用实体类插入记录时,推荐将映射的属性全部设置为可空类型。原因是实体类里的非空属性会自动产生默认值,有值的字段都会加入SQL语句中。

  • 在使用对象实例插入记录时,如果没有设置映射为时间戳类型字段的属性的值,会由于自动生成了最小时间而无法执行。解决方法1.将属性设置为可空类型。2.时间戳改为时间类型。3.设置该字段映射的属性值在时间戳允许的范围内。

  • 设置为自增长(Identity标签)的int类型的属性(多见于Id字段)建议设置为可空类型“int?”,否则会在sql插入内容中包括值为0的该字段,但是可以执行成功。

  • 批量插入时,有默认值的必填字段映射的属性要全部设置或全部不设置数值。因为参数的集合中有一个对象设置了该字段,就会在SQL语句中出现该字段,其他未设置该字段的记录则因缺少参数而不能执行成功。

  • An int attribute with Key and Identity tags, and the mapped data column is an auto-growth column.

  • The fields identified by Required and Key are required and do not need to be set repeatedly.

  • For attributes without a Column tag, the corresponding column name will be generated from the attribute name according to the database brand, and the corresponding column type and default maximum length will also be generated according to the data type of the attribute.

  • The Identity label (automatic growth) is only valid for int type columns. After the DefaultValue is set for non-int type columns, the Identity label will be ignored.

  • For attribute mapping columns with the Computed tag set, the default value will be calculated when inserting and updating, and the default value for which Computed is not set is only calculated when inserting.

  • If the value of the required item is not set when inserting data, and the item has no default value, the Insert statement will automatically increase the default value of the item type according to the content of "TypeName". If TypeName is not set, the closest field type will be assigned based on the attribute type.

  • When using the entity class to insert records, it is recommended to set all mapped attributes to nullable types. The reason is that the non-empty attributes in the entity class will automatically generate default values, and the fields with values will be added to the SQL statement.

  • When inserting a record using an object instance, if the value of the attribute mapped to the timestamp type field is not set, it cannot be executed because the minimum time is automatically generated. Workaround 1. Set the property as a nullable type. 2. Change the timestamp to time type. 3. Set the attribute value of the field mapping within the range allowed by the timestamp.

  • It is recommended to set the int type attribute (mostly seen in the Id field) to the self-growth (Identity tag) as the nullable type "int?", otherwise the field with a value of 0 will be included in the SQL insertion content, but it can be executed successfully .

  • When inserting in batches, the attributes mapped to mandatory fields with default values must be set or not set at all. Because there is an object in the set of parameters with this field set, this field will appear in the SQL statement, and other records without this field cannot be executed successfully due to lack of parameters.

Product Compatible and additional computed target framework versions.
.NET net6.0 is compatible.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 was computed.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.5.9 158 8/21/2024
1.5.8 155 8/21/2024
1.5.7 165 8/20/2024
1.5.6 150 8/19/2024
1.5.5 143 8/19/2024
1.5.5-beta9 116 8/9/2024
1.5.5-beta8 82 8/8/2024
1.5.5-beta7 103 8/8/2024
1.5.5-beta6 96 8/7/2024
1.5.5-beta5 86 8/6/2024
1.5.5-beta4 88 8/6/2024
1.5.5-beta3 106 8/6/2024
1.5.5-beta2 83 8/5/2024
1.5.5-beta18 123 8/16/2024
1.5.5-beta17 123 8/16/2024
1.5.5-beta16 118 8/15/2024
1.5.5-beta15 134 8/15/2024
1.5.5-beta14 118 8/14/2024
1.5.5-beta13 119 8/12/2024
1.5.5-beta12 118 8/12/2024
1.5.5-beta11 123 8/12/2024
1.5.5-beta10 119 8/11/2024
1.5.5-beta1 72 7/31/2024
1.5.4 103 7/30/2024
1.5.3 112 7/28/2024
1.5.2 114 7/27/2024
1.5.1 113 7/26/2024
1.5.0 118 7/26/2024
1.4.0 117 7/26/2024
1.3.14 141 7/18/2024
1.3.13 127 7/15/2024
1.3.12 125 7/13/2024
1.3.12-beta9 112 6/29/2024
1.3.12-beta8 98 6/29/2024
1.3.12-beta7 112 6/27/2024
1.3.12-beta6 112 6/27/2024
1.3.12-beta5 103 6/26/2024
1.3.12-beta4 112 6/25/2024
1.3.12-beta3 107 6/25/2024
1.3.12-beta29 87 7/12/2024
1.3.12-beta28 102 7/11/2024
1.3.12-beta27 98 7/11/2024
1.3.12-beta26 117 7/8/2024
1.3.12-beta25 102 7/4/2024
1.3.12-beta24 93 7/4/2024
1.3.12-beta23 86 7/4/2024
1.3.12-beta22 95 7/4/2024
1.3.12-beta21 97 7/3/2024
1.3.12-beta20 91 7/3/2024
1.3.12-beta2 109 6/24/2024
1.3.12-beta19 101 7/3/2024
1.3.12-beta18 90 7/3/2024
1.3.12-beta17 94 7/3/2024
1.3.12-beta16 112 7/3/2024
1.3.12-beta15 97 7/3/2024
1.3.12-beta14 115 7/2/2024
1.3.12-beta13 97 7/2/2024
1.3.12-beta12 109 7/2/2024
1.3.12-beta11 114 7/2/2024
1.3.12-beta10 112 7/1/2024
1.3.12-beta1 116 6/23/2024
1.3.11 137 6/22/2024
1.3.11-beta9 166 6/20/2024
1.3.11-beta8 119 6/19/2024
1.3.11-beta7 121 6/19/2024
1.3.11-beta6 117 6/18/2024
1.3.11-beta5 105 6/18/2024
1.3.11-beta4 124 6/16/2024
1.3.11-beta3 127 6/16/2024
1.3.11-beta2 119 6/15/2024
1.3.11-beta12 117 6/22/2024
1.3.11-beta11 115 6/21/2024
1.3.11-beta10 114 6/20/2024
1.3.11-beta1 114 6/15/2024
1.3.10 123 6/7/2024
1.3.9 141 6/6/2024
1.3.9-beta1 103 6/5/2024
1.3.8 143 6/4/2024
1.3.7 134 6/4/2024
1.3.6 132 6/3/2024
1.3.6-beta5 110 6/2/2024
1.3.6-beta4 117 6/2/2024
1.3.6-beta3 113 6/2/2024
1.3.6-beta2 108 6/1/2024
1.3.6-beta1 117 5/26/2024
1.3.5 152 5/25/2024
1.3.4 151 5/24/2024
1.3.3 172 2/22/2024
1.3.3-beta1 123 2/2/2024
1.3.2 154 12/19/2023
1.3.2-beta4 112 12/18/2023
1.3.2-beta3 141 12/9/2023
1.3.2-beta2 109 12/9/2023
1.3.2-beta1 136 12/9/2023
1.3.1 209 11/3/2023
1.3.1-beta2 112 11/2/2023
1.3.1-beta1 121 10/31/2023
1.3.0 161 10/27/2023
1.3.0-beta8 121 10/27/2023
1.3.0-beta7 128 10/26/2023
1.3.0-beta6 134 10/26/2023
1.3.0-beta5 122 10/26/2023
1.3.0-beta4 115 10/25/2023
1.3.0-beta3 135 10/25/2023
1.3.0-beta2 144 10/18/2023
1.3.0-beta1 125 10/16/2023
1.2.5-beta7 145 10/12/2023
1.2.5-beta6 117 10/12/2023
1.2.5-beta5 122 10/12/2023
1.2.5-beta1 134 9/28/2023
1.2.4 165 9/21/2023
1.2.4-beta2 132 9/20/2023
1.2.4-beta1 116 9/17/2023
1.2.3 174 9/13/2023
1.2.2 189 8/28/2023
1.2.2-beta1 145 8/21/2023
1.2.1 183 8/8/2023
1.2.0 196 8/3/2023
1.1.7 217 7/24/2023
1.1.7-beta9 164 7/20/2023
1.1.7-beta8 167 7/20/2023
1.1.7-beta7 148 7/20/2023
1.1.7-beta6 156 7/19/2023
1.1.7-beta5 167 7/18/2023
1.1.7-beta4 148 7/18/2023
1.1.7-beta3 159 7/18/2023
1.1.7-beta2 154 7/17/2023
1.1.7-beta12 162 7/21/2023
1.1.7-beta11 162 7/21/2023
1.1.7-beta10 168 7/21/2023
1.1.7-beta1 172 7/14/2023
1.1.6 217 7/13/2023
1.1.6-beta9 159 7/12/2023
1.1.6-beta8 158 7/11/2023
1.1.6-beta7 148 7/11/2023
1.1.6-beta6 161 7/10/2023
1.1.6-beta5 170 7/7/2023
1.1.6-beta4 148 7/7/2023
1.1.6-beta3 157 7/7/2023
1.1.6-beta2 168 7/4/2023
1.1.6-beta10 175 7/13/2023
1.1.6-beta1 168 6/29/2023
1.1.5 201 6/28/2023
1.1.5-beta6 163 6/28/2023
1.1.5-beta5 146 6/28/2023
1.1.5-beta4 140 6/25/2023
1.1.5-beta3 163 6/25/2023
1.1.5-beta2 157 6/25/2023
1.1.5-beta1 155 6/25/2023
1.1.4 196 6/21/2023
1.1.3 163 6/21/2023
1.1.2 179 6/20/2023
1.1.1 186 6/20/2023
1.1.0 183 6/20/2023
1.1.0-beta9 149 6/9/2023
1.1.0-beta8 142 6/9/2023
1.1.0-beta7 165 6/9/2023
1.1.0-beta6 174 6/9/2023
1.1.0-beta5 146 6/9/2023
1.1.0-beta4 158 6/9/2023
1.1.0-beta3 148 6/9/2023
1.1.0-beta2 166 6/9/2023
1.1.0-beta17 140 6/14/2023
1.1.0-beta16 146 6/14/2023
1.1.0-beta15 158 6/14/2023
1.1.0-beta14 141 6/13/2023
1.1.0-beta13 166 6/10/2023
1.1.0-beta12 172 6/10/2023
1.1.0-beta11 146 6/10/2023
1.1.0-beta10 170 6/10/2023
1.1.0-beta1 174 6/9/2023
1.0.13 221 6/6/2023 1.0.13 is deprecated because it has critical bugs.
1.0.12 196 6/6/2023
1.0.11 169 6/5/2023
1.0.10 173 5/25/2023
1.0.9 176 5/24/2023
1.0.8 158 5/22/2023
1.0.7 224 5/3/2023
1.0.6 230 3/23/2023
1.0.5 252 3/19/2023
1.0.4 306 3/13/2023
1.0.3 268 3/10/2023
1.0.1 403 2/11/2023
1.0.0 653 9/29/2020

Three-table queries are allowed.
       Fix the problem that the int? type attribute reports an error when querying multiple tables.