Simple.Data 使用建议

实际使用 Simple.Data 依然存在一些问题需要注意,还有一些使用经验分析
Simple.Data 使用动态类型可以忽略大小写,但建议采用 C# 规范保持首字母大写

加载关联对象

数据库存在表 Node,字段有 No 和 ParentNo,No 是主键,ParentNo 是外键关联表 Node 的 No,即自身引用

  • 定义节点

    定义数据类和对象类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    // 节点数据表类
    public class Node
    {
    public string No { get; set; } // 当前节点编号
    public string ParentNo { get; set; } // 上级节点编号
    }
    // 节点对象类
    public class NodeObject
    {
    public string No { get; set; } // 当前节点编号
    public NodeObject Parent { get; set; } // 上级节点对象
    }
  • 检索节点

    变量 db 表示数据库对象实体

    1
    2
    3
    4
    var no = "001";
    var getToDynamic = db.Node.Get(no); // dynamic
    var getByTemplate = db.Node.Get<Node>(no); // dynamic,实际类型 Node
    Node getToNode = db.Node.Get<Node>(no); // Node

    dynamic 类型转换

    1
    2
    3
    4
    var nodeByStrong = (Node)getToDynamic; // 强类型转换 Node
    Node nodeByDefined = getToDynamic; // 定义转换实体 Node
    string parentNo = getToDynamic.ParentNo; // dynamic 获取属性
    //string parentNo = nodeByStrong.ParentNo; // 实际类型获取属性

    读取上级节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* 存在外键可通过表名获取 SimpleQuery,再获取数据对象
    * 原理是 SimpleRecord 分析外键获取 SimpleQuery
    * SimpleQuery 对象使用部分命令,如:OrderBy/Select 等
    * 但因存在 Where 命令,暂时为止如何使用重写 Where
    */
    var parentByDynamic = getToDynamic.Node.FirstOrDefault();
    var gradeParent = getToDynamic.Node.Node.FirstOrDefault(); // 待测试
    /* 通过上级节点对象获取编号
    * 通过属性获取上级节点编号
    */
    Assert.AreEqual(parentByDynamic.No, getToDynamic.ParentNo); // true
    Assert.AreEqual(gradeParent.No, parentByDynamic.ParentNo); // true

    节点对象使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // NodeObject,可以使用 var 定义,注意不可 Get<NodeObject>,否则 Node 没有值
    dynamic nodeObject1 = db.Node.With(db.Node).Get(no);
    // 相当于:dynamic nodeObject1 = db.Node.WithNode().Get(no);
    // NodeObject,可以使用 var 或 dynamic 定义,若不使用 As 则无法赋值 Parent
    NodeObject nodeObject2 = db.Node.With(db.Node.As("Parent")).Get(no);
    /* 相当于
    * dynamic node = db.Node; // 用一张表情况下建议使用变量,代码更容易理解
    * NodeObject nodeObject1 = db.Node
    * Join(db.Node.As("Parent"), out parent).On(parent.No == node.ParentNo)
    * //.Join(db.Node.As("Parent"), out parent).On(no: node.ParentNo)
    * .With(parent.As("Parent"))
    * .Get(no);
    */
    Assert.AreEqual(nodeObject1.Node.No, nodeObject2.Parent.No)