5

SqlBuilder クラスを使用するために従うことができるドキュメントや例が見つかりません。

SQL クエリを動的に生成する必要があり、このクラスを見つけました。これが最良の選択肢でしょうか?

4

1 に答える 1

5

開始するのに最適な場所は、github リポジトリから dapper ソース コードをチェックアウトし、SqlBuilderコードを確認することです。SqlBuilderクラスはわずか 200 行程度であり、必要に応じて正しいかどうかを十分な情報に基づいて選択できるはずです。

別のオプションは、独自に構築することです。理にかなっているので、私は個人的にこのルートをたどりました。 Dapperマップは、クラスのプロパティにデータベースと同じ名前を付けるか、displayName などの属性をマップに追加すると、リフレクションを使用してプロパティ名を取得できる場合、クエリをクラスに直接選択します。名前と値を辞書に入れると、そこからかなり簡単にSQLを生成できます。

ここにあなたが始めるための何かがあります:

最初に、sqlbuilder に渡すことができるクラスの例を示します。

public class Foo
{

    public Foo()
    {
       TableName = "Foo";
    }
    public string TableName { get; set; }

    [DisplayName("name")]
    public string Name { get; set; }

    [SearchField("fooId")]
    public int Id { get; set; }

}

これはかなり基本的なことです。DisplayName 属性の背後にあるアイデアは、自動生成に含めるプロパティを分離できることです。この場合、TableName には DisplayName 属性がないため、次のクラスでは取得されません。ただし、SQLを生成してテーブル名を取得するときに手動で使用できます。

public Dictionary<string, object> GetPropertyDictionary()
    {
        var propDictionary = new Dictionary<string, object>();

        var passedType = this.GetType();

        foreach (var propertyInfo in passedType.GetProperties())
        {
            var isDef = Attribute.IsDefined(propertyInfo, typeof(DisplayNameAttribute));

            if (isDef)
            {
                var value = propertyInfo.GetValue(this, null);

                if (value != null)
                {
                    var displayNameAttribute =
                        (DisplayNameAttribute)
                            Attribute.GetCustomAttribute(propertyInfo, typeof(DisplayNameAttribute));
                    var displayName = displayNameAttribute.DisplayName;
                    propDictionary.Add(displayName, value);
                }
            }
        }

        return propDictionary;
    }

このメソッドは、そのクラスのプロパティを調べ、それらが null ではなく、displayname 属性を持っている場合、displayname 値を文字列コンポーネントとしてディクショナリに追加します。

このメソッドは、モデル クラスの一部として機能するように設計されており、別のヘルパー クラスから機能するように変更する必要があります。個人的には、すべてのモデルが継承する Base クラスに、それと他のすべての SQL 生成メソッドがあります。

ディクショナリに値を取得したら、これを使用して、渡したモデルに基づいて SQL を動的に生成できます。また、それを使用して、パラメータ化された SQL で使用するためのダッパー DynamicParamaters を設定することもできます。

これが、問題を解決するための正しい道を歩むのに役立つことを願っています。

于 2015-09-26T00:00:29.593 に答える