如何获取与SubSonic 3 LinqTemplate插入相关联的标识列值?

时间:2009-10-16 06:35:43

标签: insert subsonic3 linqtemplates

我正在使用SubSonic 3.0.0.3和Linq T4模板。例如,我的ProjectRepository有以下两种方法:

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;
}

除了执行插入(效果很好)之外,我还想获得自动递增ProjectId列的值。对于记录,此列是主键和标识列。有没有办法追加“SELECT SCOPE_IDENTITY();”查询或者我应该尝试一种完全不同的方法吗?

1 个答案:

答案 0 :(得分: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,以节省一些写作......