zoukankan      html  css  js  c++  java
  • C# Npoco ORM框架使用学习(1)

    第一个查询:

    public class User 
    {
        public int UserId { get;set; }
        public string Email { get;set; }
    }
    
    using (IDatabase db = new Database("connStringName")) 
    {
        List<User> users = db.Fetch<User>("select userId, email from users");
    }

    注: Database 需要关闭连接(可以把它当做你的对象)。

    这是通过将列名映射的属性的名称User对象。匹配不区分大小写。没有使用映射(查询)。

    映射

    默认情况下不需要映射。如果不指定其属性将会假设 表名 是类名,主键是“ID”。

    最常用的一些基本特性映射是:

    1. [TableName]需要一个“名称”参数,将被映射到表名。

    2. [PrimaryKey]表示表的主键列。多个键之间用逗号分隔。还有一个“增量”属性(AutoIncrement),用于指示是否将自动递增主键列例如标识列的SQL服务器。缺省为真。

    3. [Column]如果列名称不匹配的使用这种属性。

    4. [Ignore]此属性将被忽略,并且不被映射。

    5. [ResultColumn]标记为查询或计算结果列,这些属性将不被包括在插入或更新。注:需要被明确指定的SQL。它不会自动生成SQL。

    6. [ComputedColumn]标记为计算列属性,但他们将会自动生成SQL。

    7. [SerializedColumn](V3+)序列化的属性将序列化的数据的默认实现IColumnSerializer。有npoco.jsonnet库允许您使用JsonNetColumnSerializer

    demo:

     [TableName("Users")]
     [PrimaryKey("UserId")]
     public class User
     {
         public int UserId { get;set; }
         [Column("emailAddress")]
         public string Email { get;set; }
         [ResultColumn]
         public string ExtraInfo { get;set; }
         [Ignore]
         public int Temp { get;set; }
     }

    查询单个对象

    从数据库中查询一个对象可以几种不同方法来完成。

    通过ID

    最简单的方式是使用 SingleById<T>()方法。

    IDatabase db = new Database("connStringName");
    User u = db.SingleById<User>(3);

    通过SQL

    如果您不显式提供 字段 将自动为您生成 ,子句将随后附上。

    User u = db.Single<User>("where emailaddress = @0", "email@domain.com");
    or
    User u = db.Single<User>("select u.* from users u where emailaddress = @0", "email@domain.com");

    这两种方法都有一个“ordefault”方法。如果您不确定对象是否存在的话,请使用这些方法。如果对象不存在,而且您没有使用到 ordefault 就会引发空引用异常。

    还有 First<T> 和 FirstOrDefault<T> 如果有多条数据将抛出一个异常。如果不多于1个记录将返回结果。

    插入,更新,删除

    插入新记录

    IDatabase db = new Database("connStringName");
    User u = new User() 
    {
        Email = "name@domain.com",
        LastLoggedIn = DateTime.UtcNow
    };
    
    db.Insert(u);

    更新记录

    var user = db.SingleById(1);
    user.Email = "new@domain.com";
    db.Update(user);

    删除记录

    var user = db.SingleById(1);
    db.Delete(user);
    or
    db.Delete<User>(1);

    覆盖或新建记录

    IDatabase db = new Database("connStringName");
    User u = new User() 
    {
        Email = "name@domain.com",
        LastLoggedIn = DateTime.UtcNow
    };
    
    db.Save(u);

    这样会插入一个新记录或更新一个现有记录。它是否存在是由主键确定的。

    这个语句很危险,一定要确定你的对象里没有主键或主键不在数据库中

    查询列表

    获取所有:

    List<User> users = db.Fetch<User>();

    标准获取:

    List<User> users = db.Fetch<User>("where isActive = 1");

    使用SQL:

    List<User> users = db.Fetch<User>("select u.* from users where u.isActive = 1");

    懒惰模式

    警告:以下方法Query<T>使用生成的关键字。运行该查询的结果都j将被遍历。如果你不完全理解这一概念,请使用 Fetch<T>

    List<User> users = db.Query<User>("select u.* from users where u.isActive = 1");

    查询分页

    主要有两种方法用于查询分页。

    Page<T>

    IDatabase db = new Database("connStringName");
    Page<T> pagedUsers = db.Page<User>(2, 10, "select u.* from users u order by userid");

    其中Page<T>被定义为:

    public class Page<T> 
    {
        public long CurrentPage { get; set; }
        public long TotalPages { get; set; }
        public long TotalItems { get; set; }
        public long ItemsPerPage { get; set; }
        public List<T> Items { get; set; }
    }

    注意:您必须在SQL语句中提供一个 order by 语句,以便查询知道您希望数据分页的顺序。
    页面的第一个参数是页面编号。这个数字从第一个页面的1开始。第二个参数是页面的大小。在上面的示例中,将返回包含10个用户的第二个页面。

    SkipTake<T>

    SkipTake<T> 方法与在LINQ中跳过采取方法非常相似。它具有与页面< T >方法相同的参数数量,但第一个参数不是页码,而是跳过x个记录之后返回的记录数。第二个参数是记录的数量(即每页要取的记录数量)。为了返回与Page<T>方法相同的结果,查询将如下所示:

    List<User> users = db.SkipTake<User>(10, 10, "select u.* from users u order by userid");

     

    对事务的支持

    示例1

     using (IDatabase db = new Database("connStringName")) 
     {
         db.BeginTransaction();
         //Your CRUD operation here
         db.CompleteTransaction();
     }

    示例2

    using (IDatabase db = new Database("connStringName")) 
    {
        using (var transaction = db.GetTransaction())
        {
            //你的CRUD操作在这里
            transaction.Complete();
        }
    }
  • 相关阅读:
    2018 桂林ccpc现场赛 总结
    2018 南京icpc现场赛总结
    nowcoder 203J Graph Coloring I(dfs)
    nowcoder 203A Knight(贪心+打表)
    nowcoder 202H-卡牌游戏
    nowcoder 202F-平衡二叉树
    topcoder srm 738 div1 FindThePerfectTriangle(枚举)
    codeforces 1041 E.Vasya and Good Sequences(暴力?)
    hdu 3507 Print Article(dp+斜率优化)
    hdu 1007 Quoit Design(分治)
  • 原文地址:https://www.cnblogs.com/zyg316/p/10877047.html
Copyright © 2011-2022 走看看