zoukankan      html  css  js  c++  java
  • Farseer.net轻量级ORM开源框架 V1.x 入门篇:表的数据操作

    导航

    目   录: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

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

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

    二、实例化调用

    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);

    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).AddAssign(o => new { LoginCount = o.LogCount }, 4).AddUp();
        context.SaveChanges();
    }

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

    删除数据
    // 删除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" });
  • 相关阅读:
    NCBI SRA数据库使用详解
    自相关分析
    RandomAccessFile java
    手动安装R包
    ubuntu 设置环境变量
    Shell:Day09-2.笔记
    Shell:Day09.笔记
    Shell:Day08.笔记
    Shell:Day07.笔记
    Shell:Day06.笔记
  • 原文地址:https://www.cnblogs.com/steden/p/4555265.html
Copyright © 2011-2022 走看看