本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html

Newlife XCode组件相关文章目录:http://www.cnblogs.com/asxinyu/p/4329747.html

1.前言

声明:此Newlife.XCode非Mac的XCode,避免误会。

1.QQ群:1600800

2.博客论坛 : NewlifeX论坛 (同时也是.Net Micro Framework/ApolloOS的交流论坛,帮助软件开发者使用C#快速进入嵌入式开发领域)
             大石头博客     Asxinyu博客

  使用XCode已经3年了,谈不上精通,都是些基础功能使用,以前源码啃过很多次,了解过部分功能的实现细节,但终归是要应用的,当没有时间时,了解使用就可以了,所以现在更多关注业务相关的东西,数据库操作,XCode已经很完善了。本文就对这几年应用过程的一些问题,以及很多人经常问起来的问题进行一个总结。今天就介绍2个主要的,比较常见的使用:表达式查询,实体数据初始化。

  我们将在下一篇博客中重点介绍更加重量级的分库分表功能,以及通用配置辅助类的使用。敬请关注。

   如果文章或者资源对您有用,请“推荐”和关注,接下来还有很多.NET平台关于机器学习、彩票分析平台和预测的文章和资源待发表。

本文原始地址http://www.cnblogs.com/asxinyu/p/4248281.html

2.简洁优雅的查询

  XCode对查询语法和灵活性是我见过的ORM中最优雅的,最简单体贴的。XCode由于支持多种数据库,并且效率很高的原因就是在这些数据库核心操作的背后有许多精巧的设计,其支持的查询就是XCode灵活强大的表现之一,每天写着重复的sql,调试,拼接参数,真的很累,那么看看XCode中的查询,真的是赏心悦目,是一种享受吧。首先对XCode的查询语法进行一个简单的总结和描述:

1) XCode的查询很灵活,可以针对单个字段,也可以针对多个字段;例如:

 var model1 = Find(_.Name, "中国");
//下面2个结果是一样的,用的方法不一样
var model2 = Find(new String[] { _.Name, _.OnceName }, new object[] {"中国","China" });
var model3 = Find(_.Name == "中国" & _.OnceName == "China");
//同理看一个FindAll的使用
var modelList1 = FindAll(_.IsAsia, true);//只针对IsAsia字段
//FindAll的最常见使用:5个参数的,第一个是条件表达式,第二个是排序字段(ComanyID),第三个是选择的字段,null代表选择所有
//startIndex参数,代表起始行,默认都是从0开始,最后一个表示放回的数据行数,0代表所有行,可以只取前10。
var modelList2 = FindAll(_.IsAsia == true & _.IsAuthority == true, _.ComanyID, null, , );

2) XCode的查询是实体基类Entity<TEntity>封装好的静态方法,里面包含很多东西,建议熟练使用后的朋友,好好看一看,对理解XCode,更好的使用都有很大的好处。

3) XCode中查询满足条件的记录数有专门的FindCount方法;其方法原型和FindAll类似。

4) XCode有着非常完善的缓存体系,实体类是直接可以进行缓存设置和查询的,方法是FindAllWithCache; Meta.Cache.Entities中也有缓存数据,可以直接查询。例如:

 // 实体缓存
Meta.Cache.Entities.FindAll(_.EventId, eventid);
Meta.Cache.Entities.Find(_.Id, id);
//单对象缓存
return Meta.SingleCache[id];
FindAllWithCache(_.EventName, "西甲");

5) XCode的实体操作接口IEntityOperate中也有相对于的查询方法,使用与单个实体的Find和FindAll的使用基本相同。例如下面一段代码(2年前使用XCode迁移数据写的,非常好理解,也非常好的完成了迁移工作)。里面在对表进行处理的时候,就使用了IEntityOperate来操作,非常方便。其使用和原理可以看源码,和博客的其他文章。

 /// <summary>
/// 拷贝数据库,只需要数据库连接字符串和源数据库即可
/// </summary>
/// <param name="originConn">源数据库连接字符串</param>
/// <param name="desConn">目的数据库连接字符串</param>
/// <param name="perCount">每次获取的记录数目,如果默认-1则会自动调用函数计算一个合理值</param>
public static void CopyDataBase(string originConn,string desConn,int perCount = -)
{
//思路:通过源数据库获取架构信息,然后反向工程,然后导出数据
DAL dal = DAL.Create(originConn);
List<IDataTable> tableList = dal.Tables;//获取源数据库的架构信息
tableList.RemoveAll(t => t.IsView);//过滤掉视图
//首先拷贝数据库架构
DAL desDal = DAL.Create(desConn);//要在配置文件中启用数据库架构才行
desDal.Db.CreateMetaData().SetTables(tableList.ToArray());
//然后依次拷贝每个表中的数据
foreach (var item in tableList)
{
//首先根据表名称获取当前表的实体操作接口
IEntityOperate Factory = dal.CreateOperate(item.Name);
//分页获取数据,并更新到新的数据库,通过更改数据库连接来完成
int allCount = Factory.FindCount ();
if (perCount < ) perCount = GetDataRowsPerConvert (allCount );
int pages = (int)Math.Ceiling ((double)((double )allCount/(double )perCount));
for (int i = ; i < pages ; i++)
{
Factory.ConnName = originConn;
IEntityList modelList = Factory.FindAll(string.Empty, string.Empty, string.Empty, i * perCount, perCount);
Factory.ConnName = desConn;
modelList.Insert(true);
}
Console.WriteLine("数据库{0} 数据转移完成!",item.Name );
}
}

6) XCode中的查询表达式类型是 WhereExpression,实际中的SQL语句拼接的结果就是WhereExpression类型,而该类型的拼接支持 &,| 运算符的重载,可以直接将不同的条件组合在一起。拼接的字段名称为XX._.字段名,_的实体类型的用处也主要在这里,注意WhereExpression类型是可以隐式转换为String类型的。这也是为什么有人不解直接将WhereExpression类型放入FindAll第一个参数的原因,其实已经转换成String了。看看1个实际查询综合的例子(来源于大石头BBX项目中的代码):

 /// <summary>获取有效的广告列表</summary>
public static EntityList<Announcement> GetAvailableList()
{
//return FindAll(_.StartTime < DateTime.Now & _.EndTime > DateTime.Now, null, null, 0, 0);
var now = DateTime.Now;
return Search(null, null, now, now);
} /// <summary>查询符合条件的公告</summary>
/// <param name="poster">发布者</param>
/// <param name="title">标题</param>
/// <param name="start">开始时间</param>
/// <param name="end">结束时间</param>
public static EntityList<Announcement> Search(String poster, String title, DateTime start, DateTime end)
{
if (Meta.Count <= ) return new EntityList<Announcement>(); // 公告的总数一般不多,可以使用实体缓存
if (Meta.Count < )
{
var list = Meta.Cache.Entities.ToList().AsEnumerable(); // 使用Linq从实体缓存里面过滤需要的数据
if (!poster.IsNullOrWhiteSpace()) list = list.Where(e => e.Poster.Contains(poster));
if (!title.IsNullOrWhiteSpace()) list = list.Where(e => e.Title.Contains(title));
if (start > DateTime.MinValue) list = list.Where(e => e.StartTime > start);
if (end > DateTime.MinValue) list = list.Where(e => e.EndTime < end); return new EntityList<Announcement>(list);
} var exp = new WhereExpression(); // 使用条件表达式构建查询SQL语句
if (!poster.IsNullOrWhiteSpace()) exp &= _.Poster.Contains(poster);
if (!title.IsNullOrWhiteSpace()) exp &= _.Title.Contains(title);
if (start > DateTime.MinValue) exp &= _.StartTime > start;
if (end > DateTime.MinValue) exp &= _.EndTime < end; return FindAll(exp, null, null, , );
}

至于_.这种情况,可能有人刚开始看不懂,其实看看XCoder生成的实体类型代码就知道了。这个类型是快速访问字段用的,非常方便。

3.数据库的初始化,你难道还在手动或者用SQL?

  这是一个很隐蔽的功能,应该有很多人刚入门的朋友没有注意到。这也是一个非常人性化的操作,在生成的“模型”里面,业务中有一个静态的构造函数InitData(),看看里面都有什么,这里举例是随便找的一个表,生成的结构相同,只不过字段不一样而已。虽然上面注释了,但很明显,这里是教大家怎么用的。在数据库反向工程执行的时候,首次连接数据库,就会执行这个方法,如果数据表是空的,那么程序就会自动执行指定的代码,进行数据插入。也就是说在你实际部署的时候,对于系统的初始化数据,根本不用去执行什么数据库SQL脚本,或者手动进行新建数据库和初始化的工作。

  这一切都可以在程序里面迅速完成,而且非常简单,对于开发和测试来说,都非常简单,不需要你做任何管理。比如一些用户表和管理员表,可以初始化几个帐号;例如一些单位的部门信息,权限信息,都可以进行初始化。而且这一切都支持跨数据库,可以在几个数据库之间切换;而不是每一种数据库准备一套脚本。试想一下,开发机用sqlite开发,实际部署用mysql,而程序只需要改变一个连接字符串就可以自动初始化这些数据。

  看看我的一个例子,下面是一个 欧洲赔率公司的 信息表,系统用到的赔率公司的数量不多,只有20条左右。因为,只要是新的环境,或者实际部署,系统就会根据下面的逻辑进行初始化工作。FastInsert是一个快速插入当前记录的方法,自己手动写的。

         /// <summary>首次连接数据库时初始化数据,仅用于实体类重载,用户不应该调用该方法</summary>
[EditorBrowsable(EditorBrowsableState.Never)]
protected override void InitData()
{
base.InitData();
if (Meta.Count > ) return;
if (XTrace.Debug) XTrace.WriteLine("开始初始化{0}赔率公司数据……", typeof(CompanyInfo).Name); #region 数据保存
FastInsert("平均赔率", , true, false, false, true);
FastInsert("竞彩官方", , true, false, false, true);
FastInsert("威廉希尔", , true, false, false, true);
FastInsert("立博", , true, true, false, true);
FastInsert("bet 365", , true, true, false, true);
#region 其他公司
FastInsert("Interwetten", , true, false, false, true);
FastInsert("SNAI", , true, false, false, true);
FastInsert("bwin", , true, false, false, true);
FastInsert("伟德", , true, true, false, true);
FastInsert("易胜博", , true, true, false, true);
FastInsert("澳门", , true, true, false, true);
FastInsert("Expekt", , true, false, false, true);
FastInsert("Coral", , true, false, false, true);
FastInsert("Iceland", , true, false, false, true);
FastInsert("Oddset", , true, false, false, true);
FastInsert("皇冠", , true, false, false, true);
FastInsert("利记sbobet", , true, true, false, true);
FastInsert("金宝博", , true, true, false, true);
FastInsert("10BET", , true, true, false, true);
//2014-05-08 增加亚盘公司,大小盘公司和进球公司
FastInsert("明陞", , false, true, true, true);
#endregion
FastInsert("12BET", , false, true, false, true);
#endregion if (XTrace.Debug) XTrace.WriteLine("完成初始化{0}赔率公司数据!", typeof(CompanyInfo).Name);
} /// <summary>快速插入公司信息,只在内部初始化的时候用</summary>
static void FastInsert(String name, Int32 companyId, Boolean isEurop, Boolean isAais, Boolean isTrade = false,
Boolean isAuthority = false)
{
var entity = new CompanyInfo();
entity.Name = name;
entity.OnceName = String.Empty;
entity.ComanyID = companyId;
entity.IsTrading = isTrade;
entity.IsAuthority = isAuthority;
entity.IsEurope = isEurop;
entity.IsAsia = isAais;
entity.Insert();
}
#endregion

数据库的主要操作就十分增删查改,其中查询应该是最频繁的操作,在XCode中用好查询,不仅仅是会写查询,还要灵活运用XCode支持的三级缓存。要自己花点功夫去研究源码,当然X组件的视频和很多博客都有讲解到,可以去论坛和本文的博客中去寻找。

源码下载

链接: http://pan.baidu.com/s/1nt1bLDB 密码: aqx5,下载源码别忘记推荐哦。。。。

【原创】Newlife.XCode的常见功能使用(一)查询与数据初始化的更多相关文章

  1. 【目录】Newlife XCode组件相关文章目录

    本博客所有文章分类的总目录链接:本博客博文总目录-实时更新  1.Newlife XCode组件相关文章目录  1.Newlife XCode组件资源目录汇总[2013年版]    2.Newlife ...

  2. [NewLife.XCode]功能设置

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  3. [NewLife.XCode]对象字典缓存(百万军中取敌首级)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  4. [NewLife.XCode]高级增删改

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

  5. [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  6. [NewLife.XCode]增删改查入门

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  7. [NewLife.XCode]数据模型文件

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  8. [NewLife.XCode]实体类详解

    NewLife.XCode是一个有10多年历史的开源数据中间件,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和运行日志来进行深入分析,蕴含 ...

  9. [NewLife.XCode]反向工程(自动建表建库大杀器)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netstandard,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示 ...

随机推荐

  1. java内存泄漏

    java内存泄漏主要分成两个方面: (1)堆中申请的空间没有被释放 (2)对象已不在被使用,但是仍然存在在内存当中 以下集中情况可能会导致内存泄漏 (1)静态集合的使用hashmap和vector,静 ...

  2. Drupal资源

    以下是一些Drupal的常用资源. www.drupal.org:Drupal官网,拥有最全 www.acquia.com:Drupal奠基人Dries主导的专业网站,有著名的Aquia平台,功能类似 ...

  3. 【OC基础语法考试】

    OC基础语法已经全部学完,但是这些知识只是最基础的,还有很多高级知识,这个可能需要后面慢慢的去学习才能体会到.接下来我会总结前面的OC基础语法,如果大家发现有什么不正确的地方,请指正,小弟是新生,多请 ...

  4. switch...case和if...else if的判断应用

    判断成绩所属等级的 两种方法 1...      switch...case方法: #include<stdio.h> int main(void) { ;i <= ;++i) // ...

  5. halcon三种模板匹配方法

    halcon有三种模板匹配方法:即Component-Based.Gray-Value-Based.Shaped_based,分别是基于组件(或成分.元素)的匹配,基于灰度值的匹配和基于形状的匹配,此 ...

  6. linux系统用户以及用户组管理

    本系列的博客来自于:http://www.92csz.com/study/linux/ 在此,感谢原作者提供的入门知识 这个系列的博客的目的在于将比较常用的liunx命令从作者的文章中摘录下来,供自己 ...

  7. 骨骼动画的实现(OpenGL实现)

    人物模型动画一直是游戏中最重要的组成部分, 因此这里我们研究骨骼动画是如何实现的. 原理 首先模型通常是由多个三角形形成的网格构成, 每个三角形有三个顶点, 因此动画的根本原理就在于不同时间内为每个顶 ...

  8. mysql5.7 代价模型浅析

    代价模型 mysql 5.7.10代价计算相对之前的版本有5.7 代价模型浅析较大的改进.例如 代价模型参数可以动态配置,可以适应不同的硬件 区分考虑数据在内存和在磁盘中的代价 代价精度提升为浮点型 ...

  9. 解决VS2008 开发Windows Mobile 项目生成速度慢的问题(转)

    最近用VS2008开发Windows Mobile程序,使用C#..NET Compact Framework,发现项目生成速度比较慢.用VS2008打开项目后,开始一段时间生成速度还能忍受,时间一长 ...

  10. [.NET领域驱动设计实战系列]专题六:DDD实践案例:网上书店订单功能的实现

    一.引言 上一专题已经为网上书店实现了购物车的功能了,在这一专题中,将继续对网上书店案例进行完善,本专题将对网上书店订单功能的实现进行介绍,现在废话不多说了,让我们来一起看看订单功能是如何实现的吧. ...