导航

目   录:Farseer.net轻量级ORM开源框架 目录

上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射

下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

前言

  先跟大家抱歉下,教程迟迟没有更新,因为一个人的精力实在有限(借口?好吧,我认了)。

  想要Farseer.Net发展的更好,需要认真、客观解读群里朋友们的建议,实际上也确实是这样,有些思想、功能自己确实没想到(必境我自己所能接触的业务场景是非常有限的)。

  当然在考虑Farseer.Net新功能时,我一直提倡的是轻量(非深度植入、应用场景很特殊的场景)级的。出来的功能是大家喜欢的,而不是负累。

  另外,DEMO一直迟迟没有出来。有些朋友不喜欢看文字教程,而喜欢来”真“的,只看代码。胜过枯燥的细述。(比如不喜欢看MSDN的帮助,而喜欢看大家分享的例子)。

  好,言归正传。回顾上篇文章的讲解中,我们知道如何来映射一个实体类了。对于表的操作,我们知道TableSet的作用。那这篇实质就是在讲TableSet的使用。

TableSet<TEntity>

  它在命名空间:FS.Core.Data.Table

  首先,先列出,我们必须用到的几个前提方法:

         /// <summary>
/// 字段选择器
/// </summary>
/// <param name="select">字段选择器</param>
public virtual TSet Select<T>(Expression<Func<TEntity, T>> select) /// <summary>
/// 查询条件
/// </summary>
/// <param name="where">查询条件</param>
public virtual TSet Where(Expression<Func<TEntity, bool>> where) /// <summary>
/// 倒序查询
/// </summary>
/// <typeparam name="TKey">实体类属性类型</typeparam>
/// <param name="desc">字段选择器</param>
public virtual TSet Desc<TKey>(Expression<Func<TEntity, TKey>> desc) /// <summary>
/// 正序查询
/// </summary>
/// <typeparam name="TKey">实体类属性类型</typeparam>
/// <param name="asc">字段选择器</param>
public virtual TSet Asc<TKey>(Expression<Func<TEntity, TKey>> asc)

  那么我们调用的方式是:

一、静态调用方式

 // 在查询时,进行字段筛选,否则将以*号查询
Table.Data.User.Select(o=>o.ID).Select(o=>new {o.UserName,o.LoginCount});
// 查询或者更新时,限定条件
Table.Data.User.Where(o=>o.ID);
// 排序方式
Table.Data.User.Desc(o=>o.ID).Asc(o=>new {o.LoginCount,o.CreateAt});
Table.Data.User.Asc(o=>o.ID);

  Table在上篇博客讲解中,我们知道它是我们自己定义的上下文,继承自DbContext,Data属性是DbContext提供的静态方式调用,事实上我们也可以这样调用:

二、实例化调用

 using(var context = new Table())
{
context.User.Select(o=>new{ o.ID, o.UserName}).Where(o=>o.ID > ).Desc(o=>o.ID)
}

  需要知道的是,以上的Where、Select、Desc、Asc调用后,返回的仍然是TableSet<TEntity>类型。这样,我们可以继续进行下一个Where、Select、Desc、Asc的调用,或者最终对数据的获取、更新操作。

  第二种方式通常在对数据库进行多次(一个逻辑里面)数据更新、插入时操作。当然这种方式保存的时候默认是开启事务的(查询不是),您也可以手动调用重截来不开启它:SaveChange(false);

Where条件使用技术

  Where方法是提供我们对数据的条件筛选功能。比如常用的如下:

// 这是最常用的 属性判断
Table.Data.User.Where(o => o.ID == )
Table.Data.User.Where(o => o.ID > || o.ID < )
Table.Data.User.Where(o => o.ID < && o.UserName.Length > ) // 批量包含数据元素:1, 2, 3, 4, 5 类似SQL 的 in 操作
var lst = new List<int> { , , , , };
Table.Data.User.Where(o => lst.Contains(o.ID)) // 模糊搜索 类似 SQL的 like %...%
Table.Data.User.Where(o => o.UserName.Contains(keywords)); // 当然也支持多条件
Table.Data.User.Where(o => o.ID >= && ( o.UserName == "张三" || o.RoleID == ) ) // 模糊搜索 + 高级搜索
var keywords = "";
var bean = Table.Data.User; // 也可以是: var bean = Table.Data.User.Select(o => new { o.UserName, o.PassWord })
bean.Where(o => o.ID > ); if (keywords.IsHaving()) { bean.Where(o => o.UserName.Contains(keywords)); } // 当Keywords有值时,进行模糊搜索 // 可以加入 或者 的操作
bean.WhereOr(o => o.RoleID == );
var lst = bean.ToList(); // 类似于: like '张% 以 张开头
Table.Data.User.Where(o => o.UserName.StartsWith("张")); // 类似于: like '%三 以 三结尾
Table.Data.User.Where(o => o.UserName.EndsWith("三")); // 忽略大小写 Oracle中查询时默认区别大小写的
Table.Data.User.Where(o => o.UserName.IsEquals("张三")); // 查询用户名的长度大于2位
Table.Data.User.Where(o => o.UserName.Length > ); // 查询 时间区别: 2014-11-06 到 2014-11-06 的数据
DateTime dt = new DateTime(,,);
Table.Data.User.Where(o => o.CreateAt >= dt && o.CreateAt < dt.AddDays()); // 位运算
Table.Data.User.Where(x => (x.SchoolAdmissionsType & schoolAdmissionsType) == schoolAdmissionsType);}
查询数据
// 返回DataTable
List<DataTable> lst = Table.Data.User.Where(o=>o.ID > ).ToTable(); // 返回List<User>
List<User> lst = Table.Data.User.Where(o=>o.ID > ).ToList(); // 返回指定字段列表
List<int> lst = Table.Data.User.Where(o=>o.ID > ).ToSelectList(o=>o.ID); // 返回单个实体
User user = Table.Data.User.Where(o=>o.ID == ).ToEntity(); // 返回数量
int count = Table.Data.User.Where(o=>o.ID != ).Count(); // 返回是否存在
bool isHave = Table.Data.User.Where(o=>o.ID != ).IsHaving(); // 返回单个字段的值
int ID = Table.Data.User.Where(o=>o.ID != ).GetValue(o=>o.ID,); // 返回累计总和
int sum = Table.Data.User.Where(o=>o.ID != ).Sum(o=>o.ID,); // 返回最大值
int ID = Table.Data.User.Where(o=>o.ID != ).Max(o=>o.ID,); // 返回最小值
int ID = Table.Data.User.Where(o=>o.ID != ).Min(o=>o.ID,);

  怎么样,爱上Farseer.Net了没,查询数据就是这么方便。没有?那我们继续看下面的更新数据的演示

更新数据
var ID = ;
using (var context = new Table())
{
// 获取指定ID
ID = context.User.Desc(o => o.ID).ToEntity().ID.GetValueOrDefault(); // 更新UserName
context.User.Where(o => o.ID == ID).Update(new UserVO() { UserName = "zz" });
// 提交保存
context.SaveChanges();
} // 不同方式的更新
Table.Data.User.Where(o => o.ID == ID).Update(new UserVO() { UserName = "bb" }); // 重载版本的更新
Table.Data.User.Update(new UserVO() { UserName = "bb", ID = ID });
插入数据:
// 获取总数量
var count = Table.Data.User.Count();
var currentCount = ;
UserVO info;
using (var context = new Table())
{
info = new UserVO() { UserName = "xx" };
// 插入数据
context.User.Insert(info, true);
context.SaveChanges(); // 获取指定实体
info = context.User.Desc(o => o.ID).ToEntity(); // 获取数量
currentCount = context.User.Count();
} // 不同方式插入数据
Table.Data.User.Insert(new UserVO() { UserName = "yy" }); // 获取实体
info = Table.Data.User.Desc(o => o.ID).ToEntity(); // 获取数量
currentCount = Table.Data.User.Count(); // GUID
Table.Data.Orders.Insert(new OrdersVO { ID = Guid.NewGuid(), OrderNo = "", CreateAt = DateTime.Now, CreateID = , CreateName = "用户1" });
数据累加

  还没完,我们还有更新时 FieldName = FieldName + 1的更新方式:

using (var context = new Table())
{
// 查询实体
var info = context.User.Desc(o => o.ID).ToEntity();
// 更新LoginCount字段
context.User.Where(o => o.ID == info.ID).AddAssign(o => new { LoginCount = o.LogCount }, ).AddUp();
context.SaveChanges();
}

  AddAssign方法是追加要更新的字段。意味着你可以追加多个字段,给与不同值的累加(或者减)。

删除数据
// 删除ID == 100的数据。
Table.Data.User.Where(o=>o.ID == ).Delete();

  然后,完了?没错,就完了。

  事实上,上面的代码演示,并非全部,其中有很多重载版本,这些重载是为了减轻调用的代码量而设计的,通过自己调用时传入Lambda也一样可以实现,并非本篇讲解的重点,所以就不一一贴出来了。

总结

  通过本篇的简单讲解,事实上你已经会用Farseer.Net来对数据库的维护了,并且视图的操作其实也是相同的操作(只是少了对数据的更新、插入、删除操作,仅此而已)。

  并且你能体会到,Farseer.Net在对数据操作时,是非常像LINQ的方式的。这样可以降低我们的学习门槛。对于大家而言,当然希望功能丰富,而使用简单,这也是我一直在努力的目标。

  好,讲解完毕,我们下一篇见!

导航

目   录:Farseer.net轻量级开源框架 目录

上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射

下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:视图实体类映射

广告时间

QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net

Farseer.Net是一款ORM框架 + 常用工具 + 扩展集合。

Farseer 寓意:先知、预言家 通常在某些场合时,提供计谋、策略。也希望该框架能给大家提供最大化的便捷。

ORM:其英文全称是:Object(对象) Relational(关系) Mapping(映射)

Farseer.Net的目标是:快速上手、快速开发、简单方便。

 Table.Data.User.Where(o=>o.ID == ).ToEntity();
Table.Data.User.Where(o=>o.ID > ).ToList();
Table.Data.User.Where(o=>o.ID != ).Delete();
Table.Data.User.Where(o=>o.ID != ).AddUp(o=>o.LoginCount, );
Table.Data.User.Where(o=>o.ID == ).Update(new User{ UserName = "newName" });
Table.Data.User.Insert(new User{ UserName = "newName" });

Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作的更多相关文章

  1. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM ...

  2. Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 下一篇:Farseer.net轻量级ORM开源 ...

  3. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源 ...

  4. Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框 ...

  5. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源 ...

  6. Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库上下文 下一篇:Farseer.net轻量级ORM开源框 ...

  7. Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级ORM开源框架 ...

  8. Farseer.net轻量级ORM开源框架 V1.x 入门篇:新版本说明

    导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次 ...

  9. Farseer.net轻量级ORM开源框架 V1.x 教程目录

    本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个 ...

随机推荐

  1. Linux中的mysql.redis

    1,Linux上的mysql MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可. 开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源 ...

  2. DBENV->open

    https://stuff.mit.edu/afs/sipb/project/sandbox/golem/db-3.0.55/docs/api_c/env_open.html #include < ...

  3. Android 网络调试 adb tcpip 开启方法

    查看ip地址:adb shell ifconfig 1.连接USB数据线,打开usb调试,使用windows的“运行”命令行方式:(此方法需配置adb环境变量,也可直接进入adb工具目录执行\andr ...

  4. Masonry remake更新约束

    前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...

  5. java虚拟机内存区域理解

    java虚拟机有的区域随着虚拟机进程的启动而存在, 有的区域依赖用户线程的启动和结束而建立和销毁. 程序计数器:为了线程切换后能恢复到正确的执行位置,每个线程都有一个独立的程序计数器.(针对java方 ...

  6. UI:数据的解析XML与JSON

    XML  和  JSON 语言  本篇博客来自互联网参考 XML 和 JSON 的互相转化 有属性的转化为对象,无属性的转化为字符串 节点的顺序性不可逆,XML有顺序,JSON 无顺序 XML 和 J ...

  7. 彻底解决SysFader:IEXPLORE.EXE应用程序错误

    彻底解决SysFader:IEXPLORE.EXE应用程序错误 转载于 西部e网(weste.net) 最近安装了IE8浏览器玩玩,但是发现一个严重的问题,就是在访问某些页面的时候,经常会出现“ysF ...

  8. Tomcat相关的LNMT和LAMT

    Tomcat相关的LNMT和LAMT LNMT:Linux Nginx MySQL Tomcat Client (http) --> nginx (reverse proxy)(http) -- ...

  9. PCB CAM自动化后台配置说明

    CAM自动化项目经历9个月时间里,在我们IT团队与工程部深入合作下,依据PCB各种场景定制特定功能,且这几个月里在不断的改进与迭代脚本功能,在此期间攻破了一个又一个难题,最终项目第一阶段已顺立上线运行 ...

  10. JAVA数据类型提升

    在java中数值进行计算事会自动进行数据类型提升,例如:计算时byte,short,char类型会提升为int数据类型. 例1: class dataType { public static void ...