Dapper.SqlMapper.Queryの汎用タイプ変換:DapperRow

2266 ワード

Dapperを使ったことがある人はみんな知っています.Dapper.SqlMapper.Queryは強いタイプのオブジェクトを直接返すことができます.つまり、私たちが言ったことです.NETのクラス(CLASS).通常、Modelを次のように定義します.
 public partial class Goods
    {
        public long Id { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
        public string Unit { get; set; }
        public string Images { get; set; }
        public string Summary { get; set; }
        public string Label { get; set; }
        public decimal NowPrice { get; set; }
        public string NowPriceLabel { get; set; }
        public byte FreeFreight { get; set; }
        public int Stock { get; set; }

        public int StoreId { get; set; }
        public string StoreName { get; set; }
    }

次に、DALレイヤでデータベースをクエリーします.次のようにします.
 Goods[] data = SqlMapper.Query<Goods>(SqlConnection, sql, paras).ToArray();

このような結果、私たちはいろいろな操作を簡単に行うことができます.しかし、テーブル内の1つのレコードまたは複数のレコードを返すなど、一般的な方法で結果を返したい場合があります.上記とは異なり、固定タイプではなく、目的のタイプを動的に返したい場合があります.
SqlMapper.Query<T> //T:Goods,Person,User 

この時私たちはどうすればいいのか、私たちは考えるかもしれません.Netでの反射ですが、反射はここでは無理なので、
SqlMapper.Query<T>// T , 

この時、私たちは直接このようにすることができます.
var data = SqlMapper.Query(SqlConnection, sql, paras);/* IEnumerable<dynamic>, class , , , :DapperRow, datatable DataRow。 new (DapperRow)。*/

では、私たちはどうすればいいのでしょうか.簡単な方法は、同じ方法を対応するDALにコピーすることです.しかし、私たちはそうしたくありません.このビジネスには他の操作がないので、私たちが望んでいるオブジェクトを返すことです.この時、私たちは汎用的な方法でこの需要を実現することができます.汎用型については、ここでは紹介しません.
コードは次のとおりです.
  /// <summary>
        ///  T 
        /// </summary>
        /// <typeparam name="T"> </typeparam>
        /// <param name="table"> </param>
        /// <param name="id"> </param>
        /// <returns></returns>
public static T GetModel<T>(string table, int id)
        {
            string sql = "select * from " + table + " where Id=" + id;
            return SqlMapper.Query<T>(SqlConnection, sql).AsList<T>()[0];// 【0】 , , 
        }

あまり文章を書かないで、説明がはっきりしないところがあれば、お許しください.しかし、最後のコードは私が表現したい意味を説明できるはずです.