使用实体框架核心在postgresql中执行存储函数返回原语

时间:2017-12-15 13:51:57

标签: postgresql stored-procedures .net-core core npgsql

我在Postgresql上运行了一个项目。我使用Entity框架来执行将返回一些值(long)的存储过程。

 public override long GetHostSequenceNumber(byte hostId, byte srvId)
 {
    var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
    var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
    var res = this.Database.SqlQuery<long>("select * from  dbo.bs_p_get_host_seqno( @host_id,@srv_id)", hId, sId).SingleOrDefault();
    return res;
  }

简单地说,假设此过程在某些表中搜索某些特定值。

它运作得很好。但现在我切换到Core 2.0,我找不到办法做同样的事情。我已经阅读了一些文章,他们说要使用FromSql,但我无法使用它,因为我没有任何实体可以添加到DbContext中。我也尝试过使用ADO并执行SQL命令,但我总是在结果中得到-1。

public override long GetHostSequenceNumber(byte hostId, byte srvId)
    {
        var hId = new Npgsql.NpgsqlParameter("@host_id", hostId);
        var sId = new Npgsql.NpgsqlParameter("@srv_id", srvId);
        var res = this.Database.ExecuteSqlCommand("select * from  bs_p_get_host_seqno(@host_id,@srv_id)", hId,sId);
        return res;
    }

但是ExecuteSqlCommand也总是返回-1并且它是int类型,我不知道如何得到我需要的结果。

1 个答案:

答案 0 :(得分:1)

所以我开始工作了。这是代码。

using (var command = this.Database.GetDbConnection().CreateCommand())
        {
            command.CommandType = CommandType.StoredProcedure;
            command.CommandText = "bs_p_get_host_seqno";
            command.Parameters.Add(new Npgsql.NpgsqlParameter("host_id", NpgsqlTypes.NpgsqlDbType.Smallint)
            { Value = hostId });
            command.Parameters.Add(new Npgsql.NpgsqlParameter("srv_id", NpgsqlTypes.NpgsqlDbType.Smallint)
            { Value = srvId });
            if (command.Connection.State == ConnectionState.Closed)
                command.Connection.Open();
            var res = (long)command.ExecuteScalar();
            return res;
        }

我的问题是我把“select * from bs_p_get_host_seqno”改为command.CommandText而不是函数名。