实际使用 Simple.Data 依然存在一些问题需要注意,还有一些使用经验分析
Simple.Data 使用动态类型可以忽略大小写,但建议采用 C# 规范保持首字母大写
加载关联对象
数据库存在表 Node,字段有 No 和 ParentNo,No 是主键,ParentNo 是外键关联表 Node 的 No,即自身引用
定义节点
定义数据类和对象类
12345678910111213// 节点数据表类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 表示数据库对象实体
1234var no = "001";var getToDynamic = db.Node.Get(no); // dynamicvar getByTemplate = db.Node.Get<Node>(no); // dynamic,实际类型 NodeNode getToNode = db.Node.Get<Node>(no); // Nodedynamic 类型转换
1234var nodeByStrong = (Node)getToDynamic; // 强类型转换 NodeNode nodeByDefined = getToDynamic; // 定义转换实体 Nodestring parentNo = getToDynamic.ParentNo; // dynamic 获取属性//string parentNo = nodeByStrong.ParentNo; // 实际类型获取属性读取上级节点
12345678910111213/* 存在外键可通过表名获取 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); // trueAssert.AreEqual(gradeParent.No, parentByDynamic.ParentNo); // true节点对象使用
12345678910111213141516// 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 则无法赋值 ParentNodeObject 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)