代码之家  ›  专栏  ›  技术社区  ›  Ben Griswold

如何获取与子音速3 LinqTemplate插入关联的标识列值?

  •  2
  • Ben Griswold  · 技术社区  · 15 年前

    我正在使用亚音速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 回复  |  直到 15 年前
        1
  •  3
  •   user1151    15 年前

    您可以使用ActiveRecord模板来实现这一点,ActiveRecord模板可以为您完成上面的所有连接(还具有内置测试)。在您的场景中,add方法将有一行:project.add(),它将返回新的ID。

    根据您的需要,您可以尝试以下操作:

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

    那应该管用……

    *编辑-您也可以在isqlquery上为此创建一个extensionmethod,以保存一些写操作…

    推荐文章