(ターン)のDapperの利点

Dapperの利点 

ターン
Yamazaki
  Yamazaki 发布于 2014/04/04 14:42
 
1860個の言葉
 
478を読みます
 
コレクション  3
   

。あなたはネイティブのSQL文のように、と彼は簡単なORMが好きなら、あなたはこのDapperのROMを愛するダウンロード
Dapperの利点を:
1を、Dapperのは軽量ORMのクラスがあります。SqlMapper.csコードファイル、dllファイルの非常に小さな40K後のコンパイラ。
2、Dapperのはすぐに。Dapperのスピードに近いたIDataReader、サポートされているデータのリストは、DataTableのを超えています。
3、Dapperのは、どのようなデータベースをサポートしています。DapperのサポートのMysql、SqlLite、MSSQL2000、MSSQL2005、オラクルとデータベースのシリーズは、もちろん、あなたが知っていれば、それはまた、モンゴDBの原則をサポートすることができます
4、パラレルにマルチテーブルオブジェクトのDapperのサポートrを。多対多の関係をサポートしています。そして侵入ではない、私はそれを使用しない、使用したいです。XMLません属性ありません。書き方を今すぐ前にコードを記述する方法。
5、配列によって反射Dapperの原理はエミットたIDataReaderをキューに入れ、迅速に取得し、オブジェクトを生成します。高性能は本当に高いです。
6、Dapperのサポートnet2.0,3.0,3.5,4.0。あなたはNet2.0で使用したい場合は[、あなたはNet2.0実行Net3.5缶の下でそれを構成する方法を見つけるためにオンラインで行くことができます。]
7、Dapperの構文は非常に簡単です。そして、データベースの設計に対応する必要があります。

以下は、以下の実施例はNET3.5時にコンパイルされ、ほとんどのNet4.0機能はデフォルト値があり、パラメータは非常に単純ですが、効率的な開発にDapperのを使用する方法について説明します。

 

//数据库里的表:
CREATE TABLE ColumnCat
(
	Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, NAME NVARCHAR(150) NULL, ModifiedOn SMALLDATETIME NULL DEFAULT(GETDATE()), Parentid INT )

 

 

CREATE TABLE Column
(
	Id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, NAME NVARCHAR(150) NULL, ModifiedDate SMALLDATETIME NULL DEFAULT(GETDATE()), ColumnCatid INT null )
共通テーブル、内容及び分類のテーブルには、分類は下のカテゴリを有することができます。以下の操作は、基本的に2回の手術台です。
//连接数据库字符串。
private readonly string sqlconnection =
                 "Data Source=RENFB;Initial Catalog=test;User Id=sa;Password=sa;"; //public readonly string mysqlconnectionString = @"server=127.0.0.1;database=test;uid=renfb;pwd=123456;charset='gbk'";

//获取Sql Server的连接数据库对象。SqlConnection
public SqlConnection OpenConnection() { SqlConnection connection = new SqlConnection(sqlconnection); connection.Open(); return connection; }

 

//获取MySql的连接数据库对象。MySqlConnection
//public MySqlConnection OpenConnection()
//{
//     MySqlConnection connection = new MySqlConnection(mysqlconnectionString);
// connection.Open(); // return connection; //}

注:MySQLデータベースを交換する必要がある場合、唯一のSQL Serverデータベースオブジェクトがコメントアウトされて接続するように機能する、MySQLデータベースオブジェクトを接続する機能をコメント解除し、一緒にコメントしてMySQLは、接続文字列をキャンセルし、あなた自身のために修正接続情報。

query()メソッド:
クエリは、()オーバーロードされとのIDbConnectionの拡張メソッドは、データベースから情報を抽出するために、我々は、ビジネス・オブジェクト・モデルを移入するために使用しました。

//先创建一个类,是数据库的ColumnCat表的模型。
public class ColumnCat
{
    public int Id { get; set; } public string Name { get; set; } public DateTime ModifiedOn { get; set; } public int Parentid { get; set; } } //获取ColumnCat对象的集合。 public IEnumerable<ColumnCat> SelectColumnCats() { using (IDbConnection conn = OpenConnection()) { const string query = "select * from ColumnCat order by id desc"; return conn.Query<ColumnCat>(query,null); } }
属性に対応する結果セットのビジネス・オブジェクト・モデル(ColumnCat)の列の別名を使用することができ、それは、とても単純なSQLの例に直接埋め込む、容易ストアドプロシージャの拡張です。
//下面使用上面的集合显示出分类。
List<ColumnCat> AllColumnCat =SelectColumnCats().ToList<ColumnCat>();
foreach (ColumnCat cat in AllColumnCat.Where(c => c.Parentid == 0)) { Response.Write("Name==>" + cat.Name + "\t"); Response.Write("时间==>" + cat.ModifiedOn + "\t"); Response.Write("<br/>"); foreach (ColumnCat c in AllColumnCat .Where<ColumnCat>(subColumnCat => subColumnCat.Parentid == cat.Id)) { Response.Write("&nbsp;&nbsp;++++"); Response.Write("Name==>" + c.Name + "\t"); Response.Write("时间==>" + c.ModifiedOn + "\t"); Response.Write("<br/>"); } }

//将一级类别和二级类别显示在页面上,如果使用一个递归,很容易实现无限级分类(你懂的)。

 

//获取单个ColumnCat对象。
public ColumnCat SelectColumnCat(int columnCatId) { using (IDbConnection conn = OpenConnection()) { const string query = "select * from ColumnCat where Id=@id"; return conn.Query<ColumnCat>(query, new { id=columnCatId}) .SingleOrDefault<ColumnCat>(); } }
ここでは、クエリは常にコレクションを返すので、我々は常に0または返すことを知っているので、我々は単に、SingleOrDefaultメソッドを呼び出し、その特性がクエリ内のSQLパラメータに一致する任意のオブジェクトにすることができQueryメソッドのパラメータにパラメータを渡します1行。
//Dapper也可以加载填充嵌套对象,考虑这样一种情形,考虑到新闻的类别属性,返回类别对象,
//我们创建一个Column的类
public class Column { public int Id { get; set; } public string Name { get; set; } public DateTime ModifiedDate { get; set; } public ColumnCat ColumnCat { get; set; } } //接下来我们来填充我们的业务对象。 public IList<Column> SelectColumnsWithColumnCat() { using (IDbConnection conn = OpenConnection()) { const string query = "select c.Id,c.Name,c.ModifiedDate,c.ColumnCatid ,cat.id,cat.[Name],cat.ModifiedOn,cat.Parentid from [Column] as c left outer join ColumnCat as cat on c.ColumnCatid=cat.id"; return conn.Query<Column, ColumnCat, Column>(query , (column, columncat) => { column.ColumnCat = columncat; return column; } , null, null, false, "Id", null, null).ToList<Column>(); } }

別段のExecuteReaderが開いて使用可能な接続を主張戻り、1、充填ネストされたオブジェクトを、しかしToListメソッド<>方法を実行するように注意:。接続の現在のステータスは、彼らが、のExecuteReaderを行って使用しての終了前にセットリストに戻る必要があったマップでの使用が終了した後、接続、およびネストされたオブジェクトを閉じていると推定され、閉じられているが、単一のオブジェクトを与えられていません。
図2に示すように、パラメータネストされたオブジェクトは、より多くの、主に最初の2つのパラメータであり、他のパラメータがヌルに役に立たない設定してもよいが、バージョン4.0の2つのパラメータのみを記述することができ、他のパラメータはデフォルト値を有しています。特に注意がsplitOnで、このパラメータは、それ以外の場合は、エラーオブジェクト参照を報告します、空にすることはできません。[SplitOnパラメータは、第2の目的を割る読ん列を意味することは、テーブルの列が自己成長Idをしている場合、このパラメータに「ID」を設定することができますどの列から2番目のオブジェクトの読み込みを開始します]。

この方法を実行します。 
 クエリメソッドは、データを取得することであるとして、Executeメソッドは、データを取得しません、方法をクエリに非常に似ていますが、それは常にではなくオブジェクトのコレクションより、総数(影響を受けた行数)を返します[例:更新を挿入および削除]。
//接下来向数据库里添加一个类别
public int InsertColumnCat(ColumnCat cat)
{
    using (IDbConnection conn = OpenConnection())
    {
        const string query = "insert into ColumnCat([name],ModifiedOn,Parentid)
        values (@name,@ModifiedOn,@Parentid)";
        int row = conn.Execute(query,cat);
        //更新对象的Id为数据库里新增的Id,假如增加之后不需要获得新增的对象, //只需将对象添加到数据库里,可以将下面的一行注释掉。 SetIdentity(conn,id=>cat.Id=id,"id","ColumnCat"); return row; } } public void SetIdentity(IDbConnection conn, Action<int> setId,string primarykey ,string tableName) { if (string.IsNullOrEmpty(primarykey)) primarykey = "id"; if (string.IsNullOrEmpty(tableName)) { throw new ArgumentException("tableName参数不能为空,为查询的表名"); } string query = string.Format("SELECT max({0}) as Id FROM {1}", primarykey , tableName); NewId identity = conn.Query<NewId>(query, null).Single<NewId>(); setId(identity.Id); } public class NewId { public int Id { get; set; } }
Dapperのは自動的にクラス属性によってバインドされているので、そのNEWIDクラスの増加が増加し、ターゲットのIDを取得し、常にNet3.5の使用の下で与えられている@@アイデンティティを使用するが、取得するには最高の機能を使用することを意図していました。オブジェクトのIDが更新を取得する必要はありません場合はもちろん、setIdentityは、共通の機能を使用することはできません。
//编译Dapper源码生成的是Net4.0下使用的,可以借助Net4.0新增的dynamic动态类型,
//SetIdentity的实现将非常方便。如下:
public void SetIdentity<T>(IDbConnection conn, Action<int> setId)
{
    dynamic identity = connection.Query("SELECT @@IDENTITY AS Id").Single();
    T newId = (T)identity.Id;
    setId(newId);
}

 

//更新一个类别: public int UpdateColumnCat(ColumnCat cat) { using (IDbConnection conn = OpenConnection()) { const string query = "update ColumnCat set name=@Name ,ModifiedOn=@ModifiedOn,Parentid=@Parentid where Id=@id"; return conn.Execute(query,cat); } } //删除一个类别: public int DeleteColumnCat(ColumnCat cat) { using (IDbConnection conn = OpenConnection()) { const string query = "delete from ColumnCat where id=@id"; return conn.Execute(query, cat); } }
ここではDapperのいくつかの高度な使い方です
//Dapper对事务处理的例子,如删除类别的同时删除类别下的所有新闻。或者删除产品的同时,
//删除产品图片表里关联的所有图片。
public int DeleteColumnCatAndColumn(ColumnCat cat) { using (IDbConnection conn = OpenConnection()) { const string deleteColumn = "delete from [Column] where ColumnCatid=@catid"; const string deleteColumnCat = "delete from ColumnCat where id=@Id"; IDbTransaction transaction = conn.BeginTransaction(); int row=conn.Execute(deleteColumn, new { catid =cat.Id},transaction,null,null); row += conn.Execute(deleteColumnCat, new { id=cat.Id},transaction,null,null); transaction.Commit(); return row; } }

 

おすすめ

転載: www.cnblogs.com/LiZhongZhongY/p/10992590.html