C#データベースマッパー

c# dapper orm

質問

私は、データベースクエリ結果をC#コードのオブジェクトに強く入力するようにマップすることを検討していました。だから私はデータベース上でクエリを実行し、オブジェクトのプロパティにレコード列をマップするために反射を使用するSqlConnectionクラスの迅速かつ汚れたヘルパーメソッドを書いた。コードは次のとおりです。

 public static T Query<T>(this SqlConnection conn, string query) where T : new()
    {
        T obj = default(T);

        using (SqlCommand command = new SqlCommand(query, conn))
        {
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    obj = new T();

                    PropertyInfo[] propertyInfos;
                    propertyInfos = typeof(T).GetProperties();

                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        var name = reader.GetName(i);

                        foreach (var item in propertyInfos)
                        {
                            if (item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase) && item.CanWrite)
                            {
                                item.SetValue(obj, reader[i], null);
                            }
                        }

                    }
                }
            }
        }

        return obj;
    }

  public class User
    {
        public int id { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public DateTime signupDate { get; set; }
        public int age { get; set; }
        public string gender { get; set; }
    }


   var user = conn.Query<User>("select id,firstname,lastname from users");      

上記のコードでもっとうまくいくものがあれば、値を結びつけるためにリフレクションを使う上の私のアプローチについてもう一度意見を述べたかっただけです。それとも、私は同じ結果を得るために取ることができる他の全く別のアプローチがあるか?

私はおそらく、ヘルパーメソッドのコードを改善するために、propertyInfosのループを削除し、代わりに辞書を使用することができると思います。微調整が必​​要なことはありますか?

PS:私はDapperを知っています、私はちょうど私がより良く学ぶのを助けるために私自身のものと同様のものを実装したいと思っていました。

受け入れられた回答

あなたがしたことは、linq-to-SQLや他のORマッパーが基本的に何をしているかです。どのように動作するかの詳細を知るには、何かをゼロから書くことが常に良いアイデアです。

もっとインスピレーションが必要な場合や、プロダクション用に用意されたものを用意したい場合は、linq-to-sqlを読むことをお勧めします。それは軽量ですが、有能です。


人気のある回答

私が考えることができるいくつかのことがあります:

  1. ループをスキップするには、以下を使用することができます:

    reader[item.Name]
    
  2. 私は何か似たようなことをやったことがありますが、決して駄目になりませんでした。リフレクションを使用しているかどうかはわかりませんが、他人のコードを読んで自分のスキルを磨くことは常に良いアイデアです(Scott Hanselmanは頻繁に推奨しています)。

  3. あなたも見てみることができます: http : //www.codeproject.com/KB/database/metaquery_part1.aspx

  4. フィールドをデータベース列にマップする属性を実装することはできますが、これは単なる楽しみのためのものです。

編集:

5:リーダーのwhileループをスキップして最初の行を取得し、クエリが1つのオブジェクトのみを返すという事実を文書化することもできます。したがって、クエリが1000行を返す場合は1000行を取得しません。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ