zoukankan      html  css  js  c++  java
  • Dapper记录

    List Support

    Dapper允许您传入IEnumerable<int>,并将自动参数化查询

    例如:

    connection.Query<int>("select * from (select 1 as Id union all select 2 union all select 3) as X where Id in @Ids", new { Ids = new int[] { 1, 2, 3 } });

    将转化为:

    select * from (select 1 as Id union all select 2 union all select 3) as X where Id in (@Ids1, @Ids2, @Ids3)" // @Ids1 = 1 , @Ids2 = 2 , @Ids2 = 3

    Multi Mapping

    Dapper允许您将一行映射到多个对象。如果您想避免无关的查询和急切的加载关联,这是一个关键特性。

    例如:

    两个类Post和User

    class Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public User Owner { get; set; }
    }
    
    class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }

    现在让我们说,我们想要映射一个连接POST和User表的查询。到目前为止,如果我们需要组合两个查询的结果,我们就需要一个新的对象来表示它,但是在这种情况下,将用户对象放在Post对象中更有意义。这是多个映射的用例。您告诉Dapper,查询返回一个Post和一个User对象,然后给它一个函数,描述包含一个Post和一个User对象的每一行要做什么。在我们的示例中,我们希望获取用户对象并将其放入POST对象中。所以我们编写函数:

    (post, user) => { post.Owner = user; return post; }

    查询方法的3种类型参数指定Dapper应该使用哪些对象来反序列化该行,以及将返回哪些对象。我们将这两行解释为Post和User的组合,并返回一个Post对象。因此类型声明变成

    <Post, User, Post>

    完整列子:

    var sql =
    @"select * from #Posts p
    left join #Users u on u.Id = p.OwnerId
    Order by p.Id";
    
    var data = connection.Query<Post, User, Post>(sql, (post, user) => { post.Owner = user; return post;});
    var post = data.First();

    当您的Id列被命名为Id或id时,Dapper能够拆分返回的行。如果主键不同,或者您要在除Id以外的点拆分行,请使用可选的splitOn参数。

     例如本地例子

     public class StudentModel
        {
            public int StudentId { get; set; }
    
            public int TeacherId { get; set; }
    
            public int ClassId { get; set; }
            public string StudentName { get; set; }
    
            public int StudentAge { get; set; }
    
            public TeacherModel Teacher { get; set; }
    
            public ClassModel Class { get; set; }
        }
    
    
      public class ClassModel
        {
            public int ClassId { get; set; }
    
            public string ClassName { get; set; }
        }
    
     public class TeacherModel
        {
            public int TeacherId { get; set; }
    
            public string TeacherName { get; set; }
        }
    
          {
                    //两表关联查询
                    string sql = "select * from [Student] left join [Class] on [Student].ClassId=[Class].ClassId";
                    using (IDbConnection con = GetConnection())
                    {
                        var data = con.Query<StudentModel, ClassModel, StudentModel>(sql, (s, c) => { s.Class = c; return s; }, splitOn: "StudentId,ClassId");
                        var post = data.First();
                    }
            }
    
    
                {
                    //三表联合
                    string sql = "select * from [Student] left join [Class] on [Student].ClassId=[Class].ClassId left join [Teacher] on [Student].TeacherId=[Teacher].TeacherId";
                    using (IDbConnection con = GetConnection())
                    {
                        var data = con.Query<StudentModel, ClassModel, TeacherModel, StudentModel>(sql, (s, c, t) => { s.Class = c; s.Teacher = t; return s; }, splitOn: "StudentId,ClassId,TeacherId");
                        var post = data.First();
                    }
                }

    Multiple Results

    Dapper允许您在一个查询中处理多个结果。

    例如:

    var sql =
    @"
    select * from Customers where CustomerId = @id
    select * from Orders where CustomerId = @id
    select * from Returns where CustomerId = @id";
    
    using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
    {
       var customer = multi.Read<Customer>().Single();
       var orders = multi.Read<Order>().ToList();
       var returns = multi.Read<Return>().ToList();
       ...
    }

    Stored Procedures

    Dapper完全支持存储:

    var user = cnn.Query<User>("spGetUser", new {Id = 1},
            commandType: CommandType.StoredProcedure).SingleOrDefault();

    如果你想要更漂亮的东西,你可以:

    var p = new DynamicParameters();
    p.Add("@a", 11);
    p.Add("@b", dbType: DbType.Int32, direction: ParameterDirection.Output);
    p.Add("@c", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
    
    cnn.Execute("spMagicProc", p, commandType: CommandType.StoredProcedure);
    
    int b = p.Get<int>("@b");
    int c = p.Get<int>("@c");

    实例:

      {
    
                    //调用存储过程并传入参数
                    using (IDbConnection con = GetConnection())
                    {
                        var p = new DynamicParameters();
                        p.Add("@TableName", "Student");
                        p.Add("@PrimaryKey", "StudentId");
                        p.Add("@Fields", "*");
                        p.Add("@Condition", "1=1");
                        p.Add("@CurrentPage", 1);
                        p.Add("@PageSize", 5);
                        p.Add("@Sort", "");
                        p.Add("@RecordCount", dbType: DbType.Int32, direction: ParameterDirection.Output);
                        var data = con.Query("ProcGetPageData", p, commandType: CommandType.StoredProcedure).ToList();
                        int dataCount = p.Get<int>("@RecordCount");
                    }
    
    
                }
  • 相关阅读:
    获取当前日期的年、月、日
    去掉后端返回过来的 % 且保留 2 位小数
    uni-app 长按复制
    rabbit——部署备份
    Mysql——查询语句备份
    Redis——常用命令
    luajit——编译运行lua
    Mac——无法退出移动硬盘解决办法
    Java——Function接口的使用
    Java——在运行mvn install或mvn package时跳过Test
  • 原文地址:https://www.cnblogs.com/move-up/p/10898506.html
Copyright © 2011-2022 走看看