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

导航

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

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

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

前言

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

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

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

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

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

TableSet<TEntity>

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

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

 1         /// <summary>
 2         ///     字段选择器
 3         /// </summary>
 4         /// <param name="select">字段选择器</param>
 5         public virtual TSet Select<T>(Expression<Func<TEntity, T>> select)
 6
 7         /// <summary>
 8         ///     查询条件
 9         /// </summary>
10         /// <param name="where">查询条件</param>
11         public virtual TSet Where(Expression<Func<TEntity, bool>> where)
12
13         /// <summary>
14         /// 倒序查询
15         /// </summary>
16         /// <typeparam name="TKey">实体类属性类型</typeparam>
17         /// <param name="desc">字段选择器</param>
18         public virtual TSet Desc<TKey>(Expression<Func<TEntity, TKey>> desc)
19
20         /// <summary>
21         /// 正序查询
22         /// </summary>
23         /// <typeparam name="TKey">实体类属性类型</typeparam>
24         /// <param name="asc">字段选择器</param>
25         public virtual TSet Asc<TKey>(Expression<Func<TEntity, TKey>> asc)

  那么我们调用的方式是:

一、静态调用方式

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

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

二、实例化调用

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

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

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

  值得注意的是:仅仅是对数据库的查询操作时,是不支持延迟执行的。换句话说,不需要调用context.SaveChange()方法。

  但如果需要对数据进行更新、插入时,则必须调用。但是如果用上文提供的静态方法,不管做何操作,也不需要调用SaveChange()。

  在这里,我在重新说明下SaveChange()方法在什么时候使用:

  1. new实例化方式
  2. 需要数据进行更新(Update)、插入(Insert)

Where条件使用技术

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

// 这是最常用的 属性判断
Table.Data.User.Where(o => o.ID == 1)
Table.Data.User.Where(o => o.ID > 1 || o.ID < 1)
Table.Data.User.Where(o => o.ID < 1 && o.UserName.Length > 0)

// 批量包含数据元素:1, 2, 3, 4, 5  类似SQL 的 in 操作
var lst = new List<int> { 1, 2, 3, 4, 5 };
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 >= 1 && ( o.UserName == "张三" || o.RoleID == 1)  )

// 模糊搜索 + 高级搜索
var keywords = "";
var bean = Table.Data.User;  //  也可以是: var bean = Table.Data.User.Select(o => new { o.UserName, o.PassWord })
bean.Where(o => o.ID > 1);

if (keywords.IsHaving()) { bean.Where(o => o.UserName.Contains(keywords)); }    // 当Keywords有值时,进行模糊搜索

// 可以加入   或者  的操作
bean.WhereOr(o => o.RoleID == 2);
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 > 2);

// 查询 时间区别:  2014-11-06  到 2014-11-06 的数据
DateTime dt = new DateTime(2014,11,6);
Table.Data.User.Where(o => o.CreateAt >= dt && o.CreateAt < dt.AddDays(1));

// 位运算
Table.Data.User.Where(x => (x.SchoolAdmissionsType & schoolAdmissionsType) == schoolAdmissionsType);}

查询数据

// 返回DataTable
List<DataTable> lst = Table.Data.User.Where(o=>o.ID > 0).ToTable();

// 返回List<User>
List<User> lst = Table.Data.User.Where(o=>o.ID > 0).ToList();

// 返回指定字段列表
List<int> lst = Table.Data.User.Where(o=>o.ID > 0).ToSelectList(o=>o.ID);

// 返回单个实体
User user = Table.Data.User.Where(o=>o.ID == 1).ToEntity();

// 返回数量
int count = Table.Data.User.Where(o=>o.ID != 1).Count();

// 返回是否存在
bool isHave = Table.Data.User.Where(o=>o.ID != 1).IsHaving();

// 返回单个字段的值
int ID = Table.Data.User.Where(o=>o.ID != 1).GetValue(o=>o.ID,0);

// 返回累计总和
int sum = Table.Data.User.Where(o=>o.ID != 1).Sum(o=>o.ID,0);

// 返回最大值
int ID = Table.Data.User.Where(o=>o.ID != 1).Max(o=>o.ID,0);

// 返回最小值
int ID = Table.Data.User.Where(o=>o.ID != 1).Min(o=>o.ID,0);

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

更新插入数据

var ID = 0;
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 = 0;
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 = "1234567890", CreateAt = DateTime.Now, CreateID = 1, 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).Append(o => new { LoginCount = o.LogCount }, 4).AddUp();
    context.SaveChanges();
}

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

  最后,是我们的数据删除,截止目前,博主还在加入逻辑删除功能,该功能在V1.2中开放:

// 删除ID == 100的数据。
Table.Data.User.Where(o=>o.ID == 100).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的目标是:快速上手、快速开发、简单方便。

1 Table.Data.User.Where(o=>o.ID == 1).ToEntity();
2 Table.Data.User.Where(o=>o.ID > 1).ToList();
3 Table.Data.User.Where(o=>o.ID != 0).Delete();
4 Table.Data.User.Where(o=>o.ID != 0).AddUp(o=>o.LoginCount, 1);
5 Table.Data.User.Where(o=>o.ID == 1).Update(new User{ UserName = "newName" });
6 Table.Data.User.Insert(new User{ UserName = "newName" });
时间: 2024-10-08 04:09:48

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

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

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表实体类映射 前言 Farseer.Net是支持多数据库的ORM,使用者通过配置文件即可切换指定的数据库而不需要修改项目中的任何代码.本篇讲述如何进行数据库环境的配置.同时也讲述其它配置文件的使用. 配置文件 1.配置文件的路径: 不管是WebForm.Mvc.WinForm,配置文件统一放在:~

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

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:没有了 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置 前言 V1.x版本终于到来了.本次版本的开发从3月份开始,花了一个月的时间完成了概念版本设计.开发.到了4月份进行多次的内核的重构设计.到了5月份进行大规模的BUG修复.代码优化. 截止到今天(6月初),已知的BUG都已修复,并已在2个项目中应用了,并且运行良好. 本篇主题 1.新增队列管理: 新版本改变了V0.x时的使用方式,以Entityf

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

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 V1.x 入门篇:数据库配置及其它配置文件 下一篇:Farseer.net轻量级开源框架 V1.x 入门篇:表的数据操作 前言 上文讲述了数据库配置及其它配置文件的使用,搭建好数据库的链接方式了,接下来就是数据库中的表与实体类的关联了(映射). 在V1.x中,新增了视图.存储过程的映射.在以往的解决方案中,视图是当成”表“来操作的. 但是我们的视图通常只是为了方便查询而建的.而表支持写操作

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

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表/视图缓存操作 TableCahceSet.ViewCahceSet 前言 在上篇中,我们学会了存储过程的关系映射,其中知道了存储过程需要使用:ProcSet作为操作的上下文,以及在Field特性上,我们知道了新的两个属性用来存储过程的参数输入输出. 在上篇末尾,提到了

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

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:数据库配置文件 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表实体类映射 前言 上文讲述了数据库配置使用,搭建好数据库的链接方式了我们知道怎么做了. 事实上,至今我们仍然还没有讲到代码方面,花了前面这么多篇幅讲解,主要是想由浅入深,不然一上来给大家讲解这讲解那的,听的也一头雾水,反而得不到效果. 这篇比较重要,因为它是我们在使用Far

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

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图实体类映射 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:存储过程实体类映射 前言 我们知道对于关系数据库,视图的出现可以在一定的情况下减少因要进行数据关联而带来的大量SQL语句,它可以让我们就像访问一张表一样的简单操作. 作为ORM来说,支持视图也是一项最基础的工作.然而大部份的ORM中,对视图没有特意去提供这个类,因为视图的SQ

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

导航 目   录:Farseer.net轻量级ORM开源框架 目录 上一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作 下一篇:Farseer.net轻量级ORM开源框架 V1.x 入门篇:视图的数据操作 前言 在V1.0中,新增了视图的映射.在以往的版本中,视图是当成”表“来操作的. 但是我们的视图通常只是为了方便查询而建的.而表支持写操作.会显的很不入调(当然MSSQL的视图也是支持写的,但是这里的视图映射是为了只读视图而来的) 先看下我DEMO中的上下文与视

Farseer.Net ORM开源框架 V1.x 教程目录

本篇教程将以Ver 1.x版本进行详细使用讲解 大家有任何疑问可以加入我们的官方QQ群进行讨论.QQ群:116228666 (Farseer.net开源框架交流) 请注明:Farseer.Net 整个框架的教程里,我们分为四个阶段,分别是:入门篇.中级篇.高级篇 入门篇:讲述框架的最常用.最基础的一些说明. 中级篇:讲述框架中一些技巧使用. 高级篇:讲述框架的流程原理.详细细述框架里的设计结构. 目录:入门篇 Farseer.net轻量级开源框架 V1.x 入门篇:新版本说明 Farseer.n

Farseer.net轻量级开源框架 入门篇:使用前说明

导航 目   录:Farseer.net轻量级开源框架 目录 上一篇:Farseer.net轻量级开源框架 入门篇: 框架性能测试 下一篇:Farseer.net轻量级开源框架 入门篇: 增.删.改.查操作演示 本篇讲解使用或者学习Farseer前需要知道一些事项: 在后续很多演示中,使用了很多扩展方法.但作者并没有明确出哪些是扩展的方法.所以读者要注意.在使用框架的时候,都需要引用扩展方法的命名空间:using FS.Extend; 为了方便,扩展方法统一放到FS.Extend中,在这里特别说