2009-10-16 32 views
2

我正在使用SubSonic 3.0.0.3以及Linq T4模板。我ProjectRepository,例如,有以下兩種方法:如何獲取與SubSonic 3 LinqTemplate插件關聯的標識列值?

public int Add(Project item) 
{ 
    int result = 0; 
    ISqlQuery query = BuildInsertQuery(item); 

    if (query != null) 
    { 
     result = query.Execute(); 
    } 
    return result; 
} 

private ISqlQuery BuildInsertQuery(Project item) 
{ 
    ITable tbl = FindTableByClassName(); 

    Insert query = null; 
    if (tbl != null) 
    { 
     Dictionary<string, object> hashed = item.ToDictionary(); 
     query = new Insert(_db.Provider).Into<Project>(tbl); 

     foreach (string key in hashed.Keys) 
     { 
      IColumn col = tbl.GetColumn(key); 
      if (col != null) 
      { 
       if (!col.AutoIncrement) 
       { 
        query.Value(key, hashed[key]); 
       } 
      } 
     } 
    } 

    return query; 
} 

隨着執行插入(偉大的工程),我真的很想得到自動遞增專案編號列的值。爲了記錄,這個列是主鍵和標識列。有沒有辦法追加「SELECT SCOPE_IDENTITY();」到查詢或者可能有一個完全不同的方法,我應該嘗試?

回答

3

您可以使用ActiveRecord模板來完成上述所有佈線(並且還具有內置測試)。在你的場景中,Add方法會有一行:Project.Add(),它會返回新的ID。

爲了你的需求,你可以試試這個:

var cmd=query.GetCommand(); 
cmd.CommandSql+=";SELECT SCOPE_IDENTITY() as newid"; 
var newID=query.Provider.ExecuteScalar(cmd); 

這應該工作..

*編輯 - 你可以創建ISqlQuery此一ExtensionMethod也節省一些寫作...

+0

感謝羅布。那就是訣竅。在發佈SubSonic 3之前,我使用了ActiveRecord和SubSonic 2.2,並且非常喜歡它,但我認爲我會爲Linq模板嘗試這個項目。到目前爲止,我對新模板感到非常滿意。再次感謝您在這裏提供的幫助之手。 – 2009-10-20 19:15:12

相關問題