/// <summary> /// 初始化数据 /// </summary> public static void InitData() { int count = 11; int ix = 0; //年级 for (ix = 0; ix <= count; ix++) { TGRADEInfo info = new TGRADEInfo(); info.FName = "年级_" + ix; info.FAddTime = DateTime.Now; info.Insert().Submit(); } //班级 for (ix = 0; ix <= count; ix++) { TClassInfo info = new TClassInfo(); info.FName = "班级_" + ix; Random rd = new Random(); info.FGradeId = rd.Next(1, 10); info.FAddTime = DateTime.Now; info.Insert().Submit(); } //学生 count = 1000; for (ix = 0; ix <= count; ix++) { TStudentInfo info = new TStudentInfo(); info.FName = "HJB" + ix; Random rd = new Random(); info.FClassId = rd.Next(2, 9); info.FAddTime = DateTime.Now; Random rdage = new Random(); info.FAage = rdage.Next(16, 20); info.Insert().Submit(); } //学分 count = 2000; for (ix = 0; ix <= count; ix++) { TStudentScoreInfo info = new TStudentScoreInfo(); Random rd = new Random(); info.FStudentId = rd.Next(2, 99); info.FAddTime = DateTime.Now; Random rdage = new Random(); info.FScore = rdage.Next(1, 100); info.Insert().Submit(); } }
/// <summary> /// 事务代码详细教程 /// </summary> public static void DbScopeDemo() { dbscope dbs = new dbscope(); //示例化事务收集器 //说明:事务收集器 dbscope.dotrancation 的参数是一个匿名委托方法 dbs.dotrancation((list, models, bulkcopymodels) => { TGRADEInfo gRadeinfo = new TGRADEInfo(); gRadeinfo.FName = "年级_" + 1; gRadeinfo.FAddTime = DateTime.Now; var gradid = gRadeinfo.AddInScope(models); /** * 如果 下面的代码需要用到新增数据的在数据库的自增种子ID,并且又需要通过事务执行。怎么办? * 如 gRadeinfo 对象是一个年级新增实例,但是下面的 classInfo 班级新增实例 中的 FGradeId 关联了 gRadeinfo 中的 主键ID。 * 那么新增模型 可以通过 db.dotrancation 的匿名委托方法中通过 AddInScope 方法操作, * 在事务中先将先执行gRadeinfo执行到数据库中,获取到ID,然后将此模型缓存起来, * 如果事务执行失败,那么此模型行将自动执行删除操作! */ if (gradid <= 0) { throw (new Exception("错误:终止事务!")); } TClassInfo classInfo = new TClassInfo(); classInfo.FName = "班级201"; Random rd = new Random(); classInfo.FGradeId = gradid; //使用上面新增的 gRadeinfo 数据库新产生的 自增长主键Id classInfo.FAddTime = DateTime.Now; classInfo.Insert().AddInScope(list); // 塞入 到 list-- sqlquery 收集器中 中,等待提交执行 //学生 var count = 20; for (int ci = 0; ci <= count; ci++) { TStudentInfo info = new TStudentInfo(); info.FName = "HJB" + ci; info.FClassId = 2; info.FAddTime = DateTime.Now; Random rdage = new Random(); info.FAage = rdage.Next(16, 20); info.BulkCopy().AddInScope(bulkcopymodels);//塞入 到 bulkcopymodels-- bulkcopy 收集器 等待提交执行 } var sqlcommand = "update t_student set FAge=@age"; db.Excut(sqlcommand, new { age = 17 }).AddInScope(list); //将裸SQL的操作执行放入 listlist-- sqlquery 收集器中等待执行 var stduent_1 = db.FindQuery <TStudentInfo>().QueryById(50); stduent_1.FAage = 16; stduent_1.Update().AddInScope(list); // 塞入 到 list-- sqlquery 收集器中 中,等待提交执行 var stduent_2 = db.FindQuery <TStudentInfo>().QueryById(51); stduent_2.FAage = 18; stduent_2.Delete().AddInScope(list); // 塞入 到 list-- sqlquery 收集器中 中,等待提交执行 }); bool issuccess = dbs.Submit(); if (issuccess) { //事务提交执行成功 } else { //事务提交失败 string failmessage = dbs.ScopeException.Message; } }
static void Main(string[] args) { // 根据ID 查询: var student = db.FindQuery <TStudentInfo>().QueryById(12); #region 根据条件全量查询 学生姓名为 HJB 的同学 BList <TStudentInfo> students = db.FindQuery <TStudentInfo>().Where(p => p.FName == "HJB").Find(); // 根据条件批量查询 学生姓名为 HJB 的同学 TStudentInfo student_1 = db.FindQuery <TStudentInfo>().Where(p => p.FName == "HJB").Find().FirstOrDefault(); //此FirstOrDefault 重构过,为安全模式,数据库如果查不到数据,返回为空对象,避免返回 NULL. if (student_1.FID > 0) //说明查询到数据 { } #endregion #region 根据条件全量查询 ,查询到年龄大于等于15 岁的学生 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage >= 15).Find(); #endregion #region 根据条件全量查询 ,查询到年龄大于等于15 岁 并且 年龄 小于 17岁 的学生 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage >= 15 && p.FAage < 17).Find(); //上面的查询也可以写如下方式 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage >= 15).Where(p => p.FAage < 17).Find(); //多级 Where 查询 #endregion #region 根据条件全量查询 ,查询到年龄<>15 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage != 15).Find(); #endregion #region 根据条件全量查询,查询到名字包含 "H" 的学生 students = db.FindQuery <TStudentInfo>().Where(p => p.FName.Contains("H")).Find(); //Contains 运行最终 Sql 为 : '%H%',暂时不支持 'H%','%H' #endregion #region 根据条件全量查询,多级 Where 查询 var studentquery = db.FindQuery <TStudentInfo>().Where(p => p.FName.Contains("H")); //Contains 运行最终 Sql 为 : '%H%',暂时不支持 'H%','%H' studentquery.Where(p => p.FAage > 15); students = studentquery.Find(); #endregion #region 根据条件全量查询 ,查询到年龄<>15 的总数量 var count = db.FindQuery <TStudentInfo>().Where(p => p.FAage != 15).FindCount(); #endregion #region ASC 正序 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenAsc(p => p.FAddTime).Find(); #endregion #region DESC 正序 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenDesc(p => p.FAddTime).Find(); #endregion #region DESC 多级正序 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenDesc(p => p.FAage).ThenDesc(p => p.FAddTime).Find(); #endregion #region ASC 多级正序 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenAsc(p => p.FAage).ThenAsc(p => p.FAddTime).Find(); #endregion #region (ASC-DESC) 多级正序倒序混排 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenAsc(p => p.FAage).ThenDesc(p => p.FAddTime).Find(); #endregion #region 单表模型驱动查询--只查询符合条件的前 N 条数据,并且只返回具体的列(FAage,FName): students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenAsc(p => p.FAage).ThenDesc(p => p.FAddTime).SetSize(10).Select(c => new object[] { c.FAage, c.FName }).Find(); //后面的 SetSize(N) 方法指定了需要查询的前N 条数量 students = db.FindQuery <TStudentInfo>().Where(p => p.FAage > 15).ThenAsc(p => p.FAage).ThenDesc(p => p.FAddTime).SetSize(10).Select(c => new List <object> { c.FAage, c.FName }).Find(); //后面的 SetSize(N) 方法指定了需要查询的前N 条数量 #endregion #region 高级查询直接SQL语句查询(非分页) //查出分数>=90分的学生姓名以及具体学分 DataTable dt = db.FindQuery(@"SELECT score.FScore,student.FName as studentNameFROM t_StudentScore score LEFT JOIN t_student student ON score.FStudentId = student.FID where score.FScore>=@score ", new { score = 90 }).Find(); #endregion #region 分页查询示例 List <TScoreSearchDto> list = getScoreList(1, "H"); #endregion #region 插入、删除、更新示例 DemoForOp(); DemoFopOpByDirectSql(11); #endregion #region //WITH 子句的支持 With_Page_Demo(1, "H"); #endregion Console.ReadKey(); }