如何使用Dapper执行Postgres函数

时间:2019-06-20 12:20:23

标签: c# postgresql stored-procedures .net-core dapper

当我尝试使用dapper调用postgre函数时出现错误。我在哪里做错了?如果您能帮助我,我会很高兴。

错误消息:

 availability_list(facilityId => integer, startDate => timestamp without time zone, endDate => timestamp without time zone) does not exist"

使用Dapper调用postgre函数:

var func = "public.availability_list";

var result = db.Query<ReportResponse>(
            sql: func,
            param: new { facilityId = request.FacilityId, startDate = 
            DateTime.Now, endDate = DateTime.Now },
            commandType: CommandType.StoredProcedure, 
            commandTimeout: 900) as List<ReportResponse>;

我的Postgre函数:

CREATE FUNCTION Availability_List(facilityId int, startDate date, endDate date)
RETURNS report_type[] 
AS 
$$

DECLARE
result_record report_type[];

BEGIN

result_record := array(  
SELECT...
);

RETURN result_record;

 END $$ LANGUAGE plpgsql;

4 个答案:

答案 0 :(得分:1)

我希望您需要指定参数,函数的架构以及结果应匹配。可能会执行以下操作,然后您可以替换返回类型以查看其是否正确映射。

var result = _connection.Query<dynamic>(
    "SELECT dbo.Availability_List(@facilityId, @startDate, @endDate)", 
    new { 
        facilityId = request.FacilityId, 
        startDate = DateTime.Now, 
        endDate = DateTime.Now 
    },
    commandType: CommandType.Text,
    commandTimeout: 900);

答案 1 :(得分:1)

尝试以小写形式传递函数参数,即

var result = db.Query<ReportResponse>(
            sql: func,
            param: new { facilityid = request.FacilityId, startdate = 
            DateTime.Now, enddate = DateTime.Now },
            commandType: CommandType.StoredProcedure, 
            commandTimeout: 900) as List<ReportResponse>;

对我有用。

答案 2 :(得分:0)

我认为发生这种情况是因为您创建了函数Availability_List,其中AL大写。但是随后您将使用所有小写字母来调用该函数。我已经遇到了这个问题,请在小情况下全部使用。这样会更好...

答案 3 :(得分:0)

您的startDate,endDate作为DateTime传递。 Postgres会将其作为时间戳记。 函数定义为

CREATE FUNCTION availability_list(
  facilityId int, 
  startDate timestamp without time zone,  
  endDate timestamp without time zone
)