XIKEW.COM - 实用教程 - LinkCore插件开发之IORM - 实用教程,M - 除了快速轻巧的IDB来操作数据库,我们还需要一种更安全且容易维护的方式

[已过时] LinkCore插件开发之IORM
LINKCORE NETCORE 6/28/2020 11:07:06 PM 阅读:10

除了快速轻巧的IDB来操作数据库,我们还需要一种更安全且容易维护的方式 IORM

注意

LINKCORE已经支持到 NET5.0+ 本文章只使用NET3.0

LinkCore?

点击查看介绍

提前准备

  1. 参考路由设置新建一个 WebMain 的路由项目
  2. 或者你也可以直接 WebMain 或 WPFMain 根目录下的 **LinkCore.Interface.dll

使用说明

IORM和IDB的思想是相同的,虽然IORM在对模型的依赖上会更强,但是好处是确保修改模型和属性类型的时候编译器能告诉你错误的引用!

示例说明

//一个测试用的模型
public class TestModel
{
    //指定数据库字段名,是否主键及是否自增长
    [ORMColumn(Name = "_id", IsPrimaryKey = true)]
    [ORMColumnInfo(AutoIncrement = true)]
    public object Id { get; set; }

    public string StringValue { get; set; }

    public DateTime DateTimeValue { get; set; }

    public Int32 Int32Value { get; set; }
}

//用于JOIN测试的模型
public class TestJoinModel
{
    [ORMColumn(Name = "_id", IsPrimaryKey = true)]
    [ORMColumnInfo(AutoIncrement = true)]
    public object Id { get; set; }

    public object ParentId { get; set; }

    public string StringValue { get; set; }
}

数据库操作

# 如果你想使用MONGODB可以开启以下代码
//var db = IORM.GetMongoDB("MongoDB");
//var connectResult = db.Connect(
//    (string)GLOBAL.CONFIG.MongoDB.IP,
//    (string)GLOBAL.CONFIG.MongoDB.Port,
//    (string)GLOBAL.CONFIG.MongoDB.DbName,
//    (string)GLOBAL.CONFIG.MongoDB.UserName,
//    (string)GLOBAL.CONFIG.MongoDB.Password);

var db = IORM.GetMYSQL("MYSQL");
var connectResult = db.Connect(
    (string)GLOBAL.CONFIG.MYSQL.IP,
    (string)GLOBAL.CONFIG.MYSQL.Port,
    (string)GLOBAL.CONFIG.MYSQL.DbName,
    (string)GLOBAL.CONFIG.MYSQL.UserName,
    (string)GLOBAL.CONFIG.MYSQL.Password);

if (connectResult)
{
    //准备一组数据
    var insertData = new TestModel { Int32Value = 1, StringValue = "AA", DateTimeValue = DateTime.Now };

    //插入数据
    var insertId = db.Table<TestModel>().Insert(insertData);
    
    //准备一组JOIN数据
    var insertJoinData = new TestJoinModel { ParentId = insertId, StringValue = "JoinTest" };

    //插入数据
    var insertJoinId = db.Table<TestJoinModel>().Insert(insertJoinData);

    //更新模型ID
    insertData.Id = (object)insertId;

    //TrackUpdate用来跟踪数据,之后的修改会被增量更新
    //所以如果不适用TrackUpdate方法,会全量更新!!!
    var query = db.Table<TestModel>().Where(m => m.Id == (object)insertId).TrackUpdate(insertData);
    insertData.StringValue = "BB";
    
    //更新数据
    query.Update(insertData);

    /***更新某个值***/
    //示例中对Int32Value值进行自增,如果想赋值需要使用 Equals 函数
    db.Table<TestModel>().Where(m => m.Id == (object)insertId).UpdateValue(m => m.Int32Value + 1);

    /***获取Count数量***/
    var resultCount = db.Table<TestModel>().Count();
    ResponseWriteBody("COUNT:" + JSON.Stringify(resultCount) + "");
    
    /***获取SUM运算***/
    var resultSum = db.Table<TestModel>().SUM(m => m.Int32Value);
    ResponseWriteBody("SUM:" + JSON.Stringify(resultSum) + "");

    /***获取AVG运算***/
    var resultAvg = db.Table<TestModel>().AVG(m => m.Int32Value);
    ResponseWriteBody("AVG:" + JSON.Stringify(resultAvg) + "");

    /***获取单条数据***/
    var resultFindOne = db.Table<TestModel>().Where(m => m.StringValue.EndsWith("BB")).Desc(m => m.Id).FindOne();
    ResponseWriteBody("FINDONE:" + JSON.Stringify(resultFindOne) + "");
    
    /***获取 GroupBy 多条数据***/
    var resultGroup = db.Table<TestModel>().GroupBy(m => m.StringValue).Desc(m => m.Id).FindAll();
    ResponseWriteBody("GROUPFINDALL:" + JSON.Stringify(resultGroup) + "");
    
    /***获取分页多条数据***/
    var resultFindAll = db.Table<TestModel>().Page(10, 1).Desc(m => m.Id).FindAll();
    ResponseWriteBody("FINDALL:" + JSON.Stringify(resultFindAll) + "");
    
    /***获取去重多条数据***/
    var resultDistinct = db.Table<TestModel>().Distinct().Desc(m => m.Id).FindAll<Dictionary<string, object>>(m => new object[] { m.Int32Value });
    ResponseWriteBody("Distinct:" + JSON.Stringify(resultDistinct) + "");

    /***联表查询,暂时不支持MONGODB***/
    var resultJoin = db.Table<TestModel>()
        .Join<TestJoinModel>((m, mj) => m.Id == mj.ParentId)
        //.Asc(m => m.Id)
        .Where<TestJoinModel>((m, mj) => m.Id == (object)insertId && mj.ParentId == (object)insertId)
        .FindOne<TestJoinModel, Dictionary<string, object>>((m, mj) => new object[] { m.Id, m.Int32Value, mj.StringValue });
    ResponseWriteBody("JOIN:" + JSON.Stringify(resultJoin) + "");

    //查询SQL语句,暂时不支持MONGODB
    var resultQuery = db.Query<TestModel>("SELECT * FROM testmodel");
    ResponseWriteBody("QUERY:" + JSON.Stringify(resultQuery) + "");

    //删除数据
    var resultDelete = db.Table<TestModel>().Where(m => m.Id == (object)insertId).Delete();
    ResponseWriteBody("DELETE:" + JSON.Stringify(resultDelete) + "");

    //删除Join数据
    db.Table<TestJoinModel>().Where(m => m.Id == (object)insertJoinId).Delete();

}

事务

支持事务操作

var db = IORM.GetMYSQL("MYSQL");

db.Begin();
// ...数据库操作
db.Begin("point1")
//...数据库操作
db.Begin("point2")
//...数据库操作
db.Rollback("point2")
db.Rollback()
db.Commit();

复杂查询

用一段代码说明

public void GetList()
{
    var jsonData = JSON.Parse(RequestReadBody());
    var listDb = Utiliy.db.Table<CompanyLogic>();

    //查询姓名
    string SearchName = JSON.GetValue<string>(jsonData.SearchName);
    if (!String.IsNullOrEmpty(SearchName))
    {
        listDb.Where(m => m.CompanyName.Contains(SearchName));
    }

    //查询手机号
    string SearchMobile = JSON.GetValue<string>(jsonData.SearchMobile);
    if (!String.IsNullOrEmpty(SearchMobile))
    {
        listDb.Where(m => m.Mobile.Contains(SearchMobile));
    }

    //查询创建时间
    string CreateTimeRange = JSON.GetString(jsonData.CreateTimeRange);
    if (!String.IsNullOrEmpty(CreateTimeRange))
    {
        var dateRange = CreateTimeRange.Split(",");
        if (dateRange.Length > 0)
        {
            DateTime startTime = DateTime.Parse(dateRange[0]);
            listDb.Where(m => m.CreateTime >= startTime);
        }
        if (dateRange.Length > 1)
        {
            DateTime endTime = DateTime.Parse(dateRange[1]);
            listDb.Where(m => m.CreateTime <= endTime);
        }
    }

    var listCount = listDb.Count();
    var pageSize = jsonData.PageSize == null ? 10 : (int)jsonData.PageSize;
    var pageNo = jsonData.PageNo == null ? 1 : (int)jsonData.PageNo;
    var list = listDb.Page(pageSize, pageNo).Desc(m => m.UpdateTime).FindAll();

    //返回数据及分页数据
    ResponseWriteBody(JSON.Stringify(new ResponseModel
    {
        Code = "0000",
        Data = list,
        Page = new PageStruct { PageNo = pageNo, PageSize = pageSize, Total = listCount }
    }, true));
}

注意:Where函数的多重调用逻辑关系默认是AND