dapper 映射如何传入多个类型映射

Dapper简明教程 - chengjunde - 博客园
随笔 - 353, 文章 - 0, 评论 - 0, 引用 - 0
转自:http://www.cnblogs.com/Leo_wl/p/5863066.html
&&&是一款轻量级的ORM框架,有关Dapper优缺点的文章网上一大堆,这里小编就不再赘述啦。下面直接进入正题:
使用前准备
添加对Dapper的引用
  在使用Dapper之前,我们要首先添加对Dapper的引用,这里小编使用NuGet来添加引用。因为小编使用的是MySQL数据库,所以也要在项目中添加对MySql.Data的引用。
  Dapper是一款ORM框架,用于数据表和实体模型间的映射,所以在使用前我们还需要创建数据表和实体模型。
创建数据表
CREATE TABLE `t_schools` (
int(11) NOT NULL AUTO_INCREMENT ,
varchar(20)
NOT NULL ,
varchar(50)
NOT NULL ,
PRIMARY KEY (`Id`)
CREATE TABLE `t_students` (
int(11) NOT NULL AUTO_INCREMENT ,
varchar(15) NOT NULL ,
varchar(15)
NOT NULL ,
`SchoolId`
int(11) NOT NULL ,
enum('男','女','保密') NOT NULL ,
PRIMARY KEY (`Id`)
class School
若属性名和数据库字段不一致则查询不出数据,如果使用EF则可以通过Column特性
建立属性和数据表字段之间的映射关系,Dapper则不行
//[Column("Name")]
public string Title { }
public string Address { }
class Student
public string Name { }
public string Number { }
public int SchoolId { }
Dapper的基本用法
const string _connectionString = "Database=DData Source=127.0.0.1;User Id=Password=pooling=CharSet=utf8;port=3306;";
using (IDbConnection dbConnection = new MySqlConnection(_connectionString))
dbConnection.Open();
//通过匿名类型插入单条数据
dbConnection.Execute("insert into t_schools(Name,Address) values(@Name,@Address)", new { Name = "西南大学", Address = "重庆市北碚区天生路2号" });
//批量插入数据
List&School& schools = new List&School&()
new School() {Address="China·BeiJing",Title="清华大学" },
new School() {Address="杭州",Title="浙江大学" },
new School() {Address="不知道,US?",Title="哈弗大学" }
//在执行参数化的SQL时,SQL中的参数(如@title可以和数据表中的字段不一致,但要和实体类型的属性Title相对应)
dbConnection.Execute("insert into t_schools(Address,Name) values(@address,@title);", schools);
//通过匿名类型批量插入数据
dbConnection.Execute("insert into t_schools(Address,Name) values(@address,@name)",
new {Address="杨浦区四平路1239号",Name="同济大学"},
new {Address="英国",Name="剑桥"},
new {Address="美国·硅谷",Name="斯坦福大学"}
使用Dapper进行查询操作
  默认情况下Dapper会将查询到的整个数据集放到内存中,可以在Query方法中通过参数buffered来设置是否将查询结果存放到内存中
查询结果映射到强类型
var schools = dbConnection.Query&School&("select * from t_schools where Name=@name", new { Name = "西南大学" });
foreach (var school in schools)
Console.WriteLine(school.Address);
查询变量如下图:
  有上图我们可以看到,因为School类中的Title属性在数据库中没有与之对应的字段,所以Title的值为null。查询结果见下图:
查询结果映射到匿名类型
  在上面的查询中,我们将查询结果映射到了自定义的类型上。除了将查询结果映射到强类型之外,Dapper中还提供了匿名查询方式。
//查询结果result是匿名类型
var result = dbConnection.Query("select * from t_schools limit 0,3");
var resultList = result.AsList();
foreach (var l in resultList)
Console.WriteLine(l.Name);
查询结果如下:
var result = dbConnection.Query&Student&("select * from t_students where SchoolId in @schoolId", new { schoolId = new int[] { 2, 3 } });
foreach (var r in result)
var ps = r.GetType().GetProperties();
foreach (var p in ps)
Console.Write(p.Name + "=" + p.GetValue(r) + " ");
Console.WriteLine();
查询结果如下:
var result = dbConnection.Query&School&("select Name,Address from t_schools where Id between @start and @end", new { start = 2, end = 4 });
foreach (var r in result)
var ps = r.GetType().GetProperties();
foreach (var p in ps)
Console.Write(p.Name + "=" + p.GetValue(r) + " ");
Console.WriteLine();
&查询结果如下:
  使用join查询时需要用到Query方法中的splitOn参数,话说这个参数让小编纠结了很久才弄明白。关于splitOn参数的说明,可参考stackoverflow上的一篇文章
var result = dbConnection.Query&Student, School, string&("select s.Name,sc.Address from t_students s,t_schools sc where s.SchoolId=sc.Id and binary sc.Address like '%BeiJing%'",
(s, sc) =&
return s.Name + " " + sc.A
还有一点需要特别注意,泛型参数的顺序必须和SQL语句查询数据表的顺序一致,
即Student对应t_students表的查询结果s.Name,否则Query方法的查询结果
可能为null(这点也是困扰小编很久......)
splitOn: "Address"
foreach (var r in result)
Console.WriteLine(r);
查询结果如下:
Dapper执行多条SQL语句
string sql = "select Address from t_select SchoolId from t_select Name from t_students";
using (var multipleReader = dbConnection.QueryMultiple(sql))
//一次执行N条SQL语句则最多只能调用N次Read方法,否则抛异常:the reader has been disposed.
//Dapper读取查询结果数据的顺序必须要和查询语句中的查询顺序一致,否则可能读取不到数据
var schoolList = multipleReader.Read&School&();
foreach (var s in schoolList)
Console.Write(s.Address + " ");
Console.WriteLine();
var studentSchools = multipleReader.Read&Student&();
foreach (var s in studentSchools)
Console.Write(s.SchoolId + " ");
Console.WriteLine();
var studentNames = multipleReader.Read&Student&();
foreach (var s in studentNames)
Console.Write(s.Name + " ");
查询结果如下:
使用Dapper执行事务倒是没有什么需要特别说明的。
using (IDbTransaction tran = dbConnection.BeginTransaction())
dbConnection.Execute("delete from t_schools where Id=3");
throw new Exception();
tran.Commit();
tran.Rollback();
首先先创建一个存储过程
DROP PROCEDURE IF EXISTS `GetSchoolName`;
CREATE PROCEDURE `GetSchoolName`(in schoolId int,out scname varchar(20))
select `Name` into scname from t_schools where Id=schoolId;
然后在程序中调用存储过程
//在程序中调用存储过程时,存储过程名要小写,传递的参数名要和存储过程中的参数名一致(不区分大小写)
//连接字符串中的数据库名也要小写,否则抛异常:在数据库***中找不到存储过程×××
var parameters = new DynamicParameters();
parameters.Add("@scname", dbType: DbType.String, direction: ParameterDirection.Output);
parameters.Add("schoolid", 6, direction: ParameterDirection.Input);
var result = dbConnection.Query("getschoolname", parameters, commandType: CommandType.StoredProcedure);
执行结果如下:
从上图可以看出,返回值类型是Dapper中定义的DapperRow类型。
Dapper是一个轻量级的ORM框架,它是通过扩展IDbConnection接口来实现一系列的功能的。相比EF、NHibernate,它的功能较为简单。
Dapper在执行查询语句时会缓存SQL语句的相关信息,这样就保证了Dapper拥有较高的性能(原文:Dapper caches information about every query it runs, this allow it to materialize objects quickly and process parameters quickly)。
以上内容是小编自己的一个学习总结,写出来一是作为自己的学习笔记,二是和广大网友分享。文中若有错误之处,还望各位读者能够指正。
参考文章:参数化的查询
缓存和非缓存的 readers
Ansi Strings 和 varchar
限制和注意事项
Dapper 能运行在我的 db 提供者上吗?
有例子的完整例子列表吗?
谁在使用 Dapper?
跳槽了,新公司的数据库层,准确地说,数据库层和持久层使用 Dapper,这东西的确很方便~个人觉得这种方便性体现在三点:
能很方便地执行数据库 DML 和 DLL 操作。比如,当你执行一个带参数的 SQL 时,SQL 中的变量能与你传递给它的实体或匿名对象中的属性,自定匹配。而我们知道,带参数的 SQL,能提高数据库执行 SQL 的效率;
能很方便地将数据库检索结果映射为面向对象的对象。从数据库中的检索结果,通常是张二维表,如 DataTable,而应用程序中是实体类,以及实体类的集合,那么 Dapper 能够将 DataTable 自动地映射成为实体类的集合;
能很方便地书写 SQL 语句。比如,写多个 SQL,用分号分隔。
(该下载包含 Dapper 项目,项目中有 Dapper 的测试示例和性能测试例子)
(Dapper 的示例使用 SQLServer 数据库,我个人的示例是 MySQL)
Dapper 只有一个文件,你可以把它拖到你的项目中,来扩展你的 IDbConnection 接口。
它提供了三方面的帮助:
执行一个查询,并把结果映射到一个强类型 list
注意:所有的扩展方法都假设数据库连接已打开,如果关闭连接,它们将失败。
public static IEnumerable&T& Query&T&(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
public class Dog
public int? Age { }
public Guid Id { }
public string Name { }
public float? Weight { }
public int IgnoredProperty { get { return 1; } }
var guid = Guid.NewGuid();
var dog = connection.Query&Dog&(&select Age = @Age, Id = @Id&, new { Age = (int?)null, Id = guid });
dog.Count()
.IsEqualTo(1);
dog.First().Age
.IsNull();
dog.First().Id
.IsEqualTo(guid);
执行一个查询,并把结果映射到一个动态 object 的 list
public static IEnumerable&dynamic& Query (this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null, bool buffered = true)
该方法将执行 SQL,并返回一个动态 list,即 var 变量。
var rows = connection.Query(&select 1 A, 2 B union all select 3, 4&);
((int)rows[0].A)
.IsEqualTo(1);
((int)rows[0].B)
.IsEqualTo(2);
((int)rows[1].A)
.IsEqualTo(3);
((int)rows[1].B)
.IsEqualTo(4);
rows[0] 这种访问方式会出错,不知道示例是怎么给的~
执行一个不返回结果的 Command
public static int Execute(this IDbConnection cnn, string sql, object param = null, SqlTransaction transaction = null)
connection.Execute(@&
set nocount on
create table #t(i int)
set nocount off
select @a a union all select @b
set nocount on
drop table #t&, new {a=1, b=2 })
.IsEqualTo(2);
多次执行一个 Command
相同的签名也可以让你方便高效地对一个命令执行多次,例如批量加载数据(bulk-load data)。
connection.Execute(@&insert MyTable(colA, colB) values (@a, @b)&,
new[] { new { a=1, b=1 }, new { a=2, b=2 }, new { a=3, b=3 } }
).IsEqualTo(3); // 3 rows inserted: &1,1&, &2,2& and &3,3&
对任何类型实现 T 为 IEnumerable 的参数都可以执行。
Dapper 的主要特点是性能。以下数据显示对一个数据库执行 SELECT 出 500 条,并把数据映射到对象中需要多长时间。
性能测试分为三个方面:
POCO 序列化框架,支持从数据库获得静态类型的对象。使用原始的 SQL。
动态序列化框架,支持返回对象的动态列表。
典型的框架用法。往往不会涉及编写 SQL。
Performance of SELECT mapping over 500 iterations - POCO 序列化
持续时间(毫秒)
Hand coded (using a SqlDataReader)
Dapper ExecuteMapperQuery
(QueryById)
SubSonic CodingHorror
NHibernate SQL
Linq 2 SQL ExecuteQuery
Entity framework ExecuteStoreQuery
Performance of SELECT mapping over 500 iterations - dynamic 序列化
持续时间(毫秒)
Dapper ExecuteMapperQuery (dynamic)
Simple.Data
Performance of SELECT mapping over 500 iterations - 典型用法
持续时间(毫秒)
Linq 2 SQL CompiledQuery
Not super typical involves complex code
NHibernate HQL
Linq 2 SQL
Entity framework
SubSonic ActiveRecord.SingleOrDefault
参数化的查询
参数可以作为匿名类来传递。这使你可以轻松地给命名参数,只要简单地剪切和粘贴 SQL 片断,并在查询分析器中执行即可。
new {A = 1, B = &b&} // A will be mapped to the param @A, B to the param @B
Dapper 运行让你传递 IEnumerable,自动地参数化的查询。
例如下面 SQL 的 in 查询:
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
缓存和非缓存的 readers
Dapper 的默认动作是执行 SQL 并在返回时缓冲整个 reader。在大多数情况下,这是理想的,因为它能最大限度地减少数据库中的共享锁,以及减少数据库的网络时间。
但是,在执行庞大查询时,你可能为了减少内存的占用,只加载需要的对象。要做到这点,通过缓冲到查询方法中。
/// &summary&
/// NonBuffered
/// 将会抛出异常,Invalid attempt to Read when reader is closed.
/// &/summary&
public static void TestBasicStringUsageAsyncNonBuffered()
var query = DbHelp.QueryAsync&string&(new CommandDefinition(&select 'abc' as Value union all select @txt&, new { txt = &def& }, flags: CommandFlags.None));
var arr = query.Result.ToArray();
arr.IsSequenceEqualTo(new[] { &abc&, &def& });
/// &summary&
/// Buffered
/// 不会抛出异常
/// &/summary&
public static void TestBasicStringUsageAsyncBuffered()
var query = DbHelp.QueryAsync&string&(new CommandDefinition(&select 'abc' as Value union all select @txt&, new { txt = &def& }, flags: CommandFlags.Buffered));
var arr = query.Result.ToArray();
arr.IsSequenceEqualTo(new[] { &abc&, &def& });
/// &summary&
/// Pipelined
/// 将会抛出异常,Invalid attempt to Read when reader is closed.
/// &/summary&
public static void TestBasicStringUsageAsyncPipelined()
var query = DbHelp.QueryAsync&string&(new CommandDefinition(&select 'abc' as Value union all select @txt&, new { txt = &def& }, flags: CommandFlags.Pipelined));
var arr = query.Result.ToArray();
arr.IsSequenceEqualTo(new[] { &abc&, &def& });
Dapper 允许你把单行映射到多个对象。如果你想避免额外的查询和加载关联,那么这个功能就很关键了。
@&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 = return});
var post = data.First();
post.Content.IsEqualTo(&Sams Post1&);
post.Id.IsEqualTo(1);
post.Owner.Name.IsEqualTo(&Sam&);
post.Owner.Id.IsEqualTo(99);
提示:Dapper 假定你的 ID 列被命名为“ID”或“id”,如果你的主键是不同的,或者你想在点上拆分宽行点,而不是“ID”,可以使用可选的'splitOn'参数。
Dapper 允许你在一次查询中处理多个结果的集合。
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();
Dapper 完全支持存储过程:
var user = cnn.Query&User&(&spGetUser&, new {Id = 1},
commandType: CommandType.StoredProcedure).First();}}}
如果你想要更灵活的操作,可以这样做:
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&);
Ansi Strings 和 varchar
Dapper 支持 varchar 参数,如果你在一个 varchar 列上执行一个 where 语句,确保下面方式传递参数:
Query&Thing&(&select * from Thing where Name = @Name&, new {Name = new DbString { Value = &abcde&, IsFixedLength = true, Length = 10, IsAnsi = true });
在 SQL Server 上,当查询非 Unicode 时,查询 Unicode 和 ANSI 时需要使用 Unicode。
限制和注意事项
对于 Dapper 执行的每个查询的缓存信息,使得它能够快速地物化对象和处理参数。当前的实现把信息缓存在一个 ConcurrentDictionary 对象中。它存储的对象永远不会被刷新。如果你生成的 SQL 字符串没有使用参数,那么可能会出现命中内存问题。我们把字典转换成 LRU(Least Recently Used)缓存。
ORM 的很多特点都被 Dapper 去掉了,没有身份地图(Identity Map),没有更新/选择的助手等。
Dapper 不会管理你连接的生命周期,它假定它得到的连接是打开的,并且不存在 DataReader 枚举(除非启用 MARS)。
什么是 Mars?它是在创建数据库连接时指定的,下面是 Dapper 中连接 SQL Server 的示例:
public static SqlConnection GetOpenConnection(bool mars = false)
var cs = connectionS
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder(cs);
scsb.MultipleActiveResultSets = true;
cs = scsb.ConnectionS
var connection = new SqlConnection(cs);
connection.Open();
如果指定了 Mars,那么还会创建 SqlConnectionStringBuilder,并指定其 MultipleActiveResultSets 属性为 true。不过,看 Dapper 的例子,貌似 SQL Server 是有 Mars 的,但 MySQL 没有。
Dapper 能运行在我的 db 提供者上吗?
Dapper 能运行在所有 .net ado 提供者上,包括 sqlite,sqlce,firebird,oracle,MySQL,PostgreSQL 和 SQL Server。
有例子的完整例子列表吗?
Dapper 在中有完整的测试套件。
谁在使用 Dapper?
目前使用 Dapper 的有
(if you would like to be listed here let me know)
阅读(...) 评论()Posts - 43,
Articles - 0,
Comments - 307
Keep It Simple, Stupid.
22:03 by Sinte-Beuve, ... 阅读,
Dapper是.NET下一个micro的ORM,它和Entity Framework或Nhibnate不同,属于轻量级的,并且是半自动的。也就是说实体类都要自己写。它没有复杂的配置文件,一个单文件就可以了。给出官方地址。
个人觉得他非常好用,现在已经取代了原来的SqlHelper。优点:
使用Dapper可以自动进行对象映射!
轻量级,单文件。
支持多数据库。
Dapper原理通过Emit反射IDataReader的序列队列,来快速的得到和产生对象。
网上还有对Dapper的扩展类,这里就不赘述了。下面只讲下简单的增删改查、数据库表间的对应关系和事务的应用。
先给出实体类的关系:
&书和书评是1---n的关系。(沿用Entity Framework的实体类,virtual表示延迟加载,此处忽略)
public class Book
public Book()
Reviews = new List&BookReview&();
public int Id { get; set; }
public string Name { get; set; }
public virtual List&BookReview& Reviews { get; set; }
public override string ToString()
return string.Format("[{0}]------《{1}》", Id, Name);
public class BookReview
public int Id { get; set; }
public int BookId { get; set; }
public virtual string Content { get; set; }
public virtual Book AssoicationWithBook { get; set; }
public override string ToString()
return string.Format("{0})--[{1}]\t\"{3}\"", Id, BookId, Content);
基本的增删改查操作
  由于Dapper ORM的操作实际上是对IDbConnection类的扩展,所有的方法都是该类的扩展方法。所以在使用前先实例化一个IDBConnection对象。
IDbConnection conn = new SqlConnection(connString);
Book book = new Book();
book.Name="C#本质论";
string query = "INSERT INTO Book(Name)VALUES(@name)";
//对对象进行操作
conn.Execute(query, book);
//直接赋值操作
conn.Execute(query, new {name = "C#本质论"});
string query = "UPDATE Book SET
Name=@name WHERE id =@id";
conn.Execute(query, book);
string query = "DELETE FROM Book WHERE id = @id";
conn.Execute(query, book);
conn.Execute(query, new { id = id });
string query = "SELECT * FROM Book";
//无参数查询,返回列表,带参数查询和之前的参数赋值法相同。
conn.Query&Book&(query).ToList();
//返回单条信息
string query = "SELECT * FROM Book WHERE id = @id";
book = conn.Query&Book&(query, new { id = id }).SingleOrDefault();
数据库表对应关系操作
//查询图书时,同时查找对应的书评,并存在List中。实现1--n的查询操作
string query = "SELECT * FROM Book b LEFT JOIN BookReview br ON br.BookId = b.Id WHERE b.id = @id";
Book lookup = null;
//Query&TFirst, TSecond, TReturn&
var b = conn.Query&Book, BookReview, Book&(query,
  (book, bookReview) =&
    //扫描第一条记录,判断非空和非重复
    if (lookup == null || lookup.Id != book.Id)
      lookup =
    //书对应的书评非空,加入当前书的书评List中,最后把重复的书去掉。
    if (bookReview != null)
      lookup.Reviews.Add(bookReview);
    return
  }, new { id = id }).Distinct().SingleOrDefault();
//1--1操作
string query = "SELECT * FROM BookReview WHERE id = @id";
using (conn)
  br = conn.Query&BookReview, Book, BookReview&(query,
  (bookReview, book) =&
    bookReview.AssoicationWithBook =
    return bookR
   }, new { id = id }).SingleOrDefault();
  return
using (conn)
//开始事务
IDbTransaction transaction = conn.BeginTransaction();
    string query = "DELETE FROM Book WHERE id = @id";
    string query2 = "DELETE FROM BookReview WHERE BookId = @BookId";
    conn.Execute(query2, new { BookId = id }, transaction, null, null);
    conn.Execute(query, new { id = id }, transaction, null, null);
    //提交事务
    transaction.Commit();
  catch (Exception ex)
    //出现异常,事务Rollback
    transaction.Rollback();
    throw new Exception(ex.Message);
由于自己的毕设也是用它来写的,所以放出来,可以作为一个实例来参考一下。
,有兴趣的可以star一下哦~之前的微笑天使类:SmileAngel.cs &由于要使用Oracle 所以改装成支持oracle的了 并且为了方便多表之间查询,懒得去搞视图、存储过程,就写了一个通用的方法 可以支持多表查询,此方法灵活,可扩展。& &/// &summary&
& & & & /// &获取数据库集合 多表
& & & & /// &/summary&
& & & & /// &param name="table_Names"&多表 表名 按顺序逗号分隔&/param&
& & & & /// &param name="ziduans"&要查询的字段集合 根据表名先后按顺序&/param&
& & & & /// &param name="where"&查询条件&/param&
& /// &param name="parms"&关联关系 第一个是需要关联的表 逗号分割 第二个是需要关联的字段a或a1|a2&/param&&
& & & & /// &returns&&/returns&
& & & & public static List&dynamic& GetListMoreModel(string table_Names, List&string& ziduans, string where, List&dynamic& parms, string orderby)
& & & & & & int f = 1;
& & & & & & StringBuilder strSql = CtSqlHe(table_Names, ziduans, where, parms, orderby, ref f);
& & & & & & Dapper.CommandDefinition dc = new Dapper.CommandDefinition(strSql.ToString());//组织sql命令
& & & & & & return Dapper.SqlMapper.Query&object&(SmileBank.dbc, dc).ToList();//执行
&private static StringBuilder CtSqlHe(string table_Names, List&string& ziduans, string where, List&dynamic& parms, string orderby, ref int count)
& & & & & & string tableNames = "";
& & & & & & string gl_where = "";
& & & & & & List&string& list_ob = table_Names.Split(',').ToList();
& & & & & & foreach (var item in list_ob)
& & & & & & {
& & & & & & & & tableNames += DName + item + ",";
& & & & & & }
&&&&&&&&&& foreach (object col in parms)
& & & & & & {
& & & & & & & & if (gl_where != "")
& & & & & & & & {
& & & & & & & & & & gl_where += " and ";
& & & & & & & & }
& & & & & & & & string _tables = col.GetType().GetProperties()[0].GetValue(col, null).ToString();
& & & & & & & & string[] tables = _tables.Split(',');
& & & & & & & & string colName = col.GetType().GetProperties()[1].GetValue(col, null).ToString();
& & & & & & & & for (int i = 0; i & tables.L i++)
& & & & & & & & {
& & & & & & & & & & string tempcolName = colN
& & & & & & & & & & if (colName.Contains('|'))//
& & & & & & & & & & {
& & & & & & & & & & & & tempcolName = colName.Split('|')[i];
& & & & & & & & & & }
& & & & & & & & & & gl_where += DName + tables[i] + "." + tempcolName + "=";
& & & & & & & & }
& & & & & & & & if (gl_where.Length & 0)
& & & & & & & & {
& & & & & & & & & & gl_where = gl_where.Substring(0, gl_where.Length - 1);
& & & & & & & & }
& & & & & & }
& & & & & & if (tableNames.Length & 0)
& & & & & & {
& & & & & & & & tableNames = tableNames.Substring(0, tableNames.Length - 1);
& & & & & & }
& & & & & & StringBuilder strSql = new StringBuilder();
& & & & & & string ziduan = "";
& & & & & & for (int i = 0; i & ziduans.C i++)
& & & & & & {
& & & & & & & & string[] col_name = ziduans[i].Split(',');
& & & & & & & & foreach (var item in col_name)
& & & & & & & & {
& & & & & & & & & & ziduan += DName + list_ob[i] + "." + item + ",";
& & & & & & & & }
& & & & & & }
& & & & & & if (ziduan.Length & 0)
& & & & & & {
& & & & & & & & ziduan = ziduan.Substring(0, ziduan.Length - 1);
& & & & & & }
& & & & & & strSql.Append("select " + ziduan + " ");
& & & & & & strSql.Append(" FROM " + tableNames + " ");
& & & & & & //获取条数用的sql语句
& & & & & & string sql_c = "select count(1) from " + tableN
& & & & & & if (gl_where != "")
& & & & & & {
& & & & & & & & strSql.Append(" where " + gl_where);
& & & & & & & & sql_c += " where " + gl_
& & & & & & & & if (where.Trim() != "")
& & & & & & & & {
& & & & & & & & & & strSql.Append(" and " + where);
& & & & & & & & & & sql_c += " and " +
& & & & & & & & }
& & & & & & }
& & & & & & else if (where.Trim() != "")
& & & & & & {
& & & & & & & & strSql.Append(" where " + where);
& & & & & & & & sql_c += " where " +
& & & & & & }
& & & & & & if (orderby != "")
& & & & & & {
& & & & & & & & //if (gl_where == "" && where.Trim() == "")
& & & & & & & & //{
& & & & & & & & // & &strSql.Append(" where 1=1 order by " + orderby);
& & & & & & & & //}
& & & & & & & & strSql.Append(" order by " + orderby);
& & & & & & }
& & & & & & if (count == 0)
& & & & & & {
& & & & & & & & //获取条数
& & & & & & & & Dapper.CommandDefinition dc = new Dapper.CommandDefinition(sql_c.ToString());//组织sql命令
& & & & & & & & object obj = Dapper.SqlMapper.ExecuteScalar(SmileBank.dbc, dc);//执行
& & & & & & & & if (obj == null)
& & & & & & & & {
& & & & & & & & & & count = 0;
& & & & & & & & }
& & & & & & & & else
& & & & & & & & {
& & & & & & & & & & count = Convert.ToInt32(obj);
& & & & & & & & }
& & & & & & }
& & & & & & return strS
& & & & }----------------------------&由于返回的结果是动态类型集合 所以最好返回给前台的时候使用json返回 如果你发现json给你多封装了一层比如:object{object{Key:name,Value:张三}} 不用担心 下面提供一个方法可以转换成object{name:张三}
& function getnewjson(dataResult)
& & & & var newJson =new Array();
& & & & for (var i = 0; i & dataResult. i++) {
& & & & & & var data_r = dataResult[i];
& & & & & & var r_json = new Array();
& & & & & & for (var f = 0; f & data_r. f++) {
& & & & & & & & r_json[data_r[f].Key] = data_r[f].V
& & & & & & }
& & & & & & newJson[i] = r_
& & & & &&
& & & & return newJ
&------------------------by cg&上面方法更新:支持多表不同字段命名的关系调用示例片段(1):
& string where = GetSearchWhere();//这里是拼接查询条件的 如 where 1=1
& & & & & & string tables = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT";//多表查询 中的两张表 --以此类推
& & & & & & List&string& list_ziduan = new List&string&();
& & & & & & list_ziduan.Add("XM,LSH,SFZMHM,KSYY,YYCS,KSCS");//第一张表要查询的字段
& & & & & & list_ziduan.Add("XH,SQCX,JGFS,KSY1DM,KSSJ");//第二张表要查询的字段 --以此类推
& & & & & & List&dynamic& list_tj = new List&dynamic&();
& & & & & & list_tj.Add(new { tableNames = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT", colName = "ZKZMBH" });//多表关联关系
& & & &//或者这么写&& list_tj.Add(new { tableNames = "EXAM_DRV_PREASIGN,EXAM_KS_RESULT", colName = "ZKZMBH|ZKZMBH" });
& & & & & & int count = 0;
& & & & & & List&dynamic& list = SmileAngel.GetPageListMoreModel(out count, tables, list_ziduan, where, list_tj, "LSH",webpage.pageIndex-1, webpage.pageSize);
& & & & & & ViewBag.list =调用片段(2):
&string where = " ";
& & & & & & //E.KSKM,T.KSJH,T.KCDM,T.ZT,E.LSH,E.ZKZMBH,E.JSZH,E.XM,E.SQYY,E.SQCX,E.KSCS,E.KSSJ,E.JSSJ,E.JGFS,E.SYTS,E.SYSJ,E.KSY1XM,E.KSY2XM
& & & & & & string tables = "EXAM_KS_TEMP,EXAM_KTXX";
& & & & & & List&string& list_ziduan = new List&string&();
& & & & & & list_ziduan.Add("KSKM,LSH,ZKZMBH,JSZH,XM,SQYY,SQCX,KSCS,KSSJ,JSSJ,JGFS,SYTS,SYSJ,KSY1XM,KSY2XM");
& & & & & & list_ziduan.Add("KCDM,ZT,KSJH,MAC,IP,YYBB");
& & & & & & List&dynamic& list_tj = new List&dynamic&();
& & & & & & list_tj.Add(new { tableNames = "EXAM_KS_TEMP,EXAM_KTXX", colName = "KCDM" });
& & & & & & list_tj.Add(new { tableNames = "EXAM_KS_TEMP,EXAM_KTXX", colName = "KSJH" });
& & & & & & List&dynamic& list = SmileAngel.GetListMoreModel(tables, list_ziduan, where, list_tj, "LSH");
--------------------Oracle中查询第一条 不能使用top(1) 要在后面加rownum = 1&如: select a from table where &rownum = 1&
阅读(...) 评论()

我要回帖

更多关于 dapper 映射 的文章

 

随机推荐