2015-09-24 48 views

回答

2

最好的開始是從github倉庫中檢出短小的源代碼,並看看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; 
    } 

該方法着眼於它的類的屬性,如果它們不爲空,並有displayName屬性將它們添加到與顯示名稱值作爲字符串組成的字典。

此方法被設計爲模型類的一部分,需要修改以從單獨的輔助類中工作。就我個人而言,我擁有它以及我所有模型繼承的Base類中的所有其他SQL生成方法。

一旦你有了字典中的值,你就可以使用它來根據你傳入的模型動態生成sql,並且你也可以用它來填充你的Dapper DynamicParamaters以用於強化的sql。

我希望這可以幫助您找到解決問題的正確途徑。