如何使用 EF Core 从 Postgresql 函数获取结果?

How to get results from a Postgresql function using EF Core?

我的问题 非常非常非常 简单,但我无法通过使用 ASP.NET Core MVC 的 EF Core 完成此操作。我只是想使用带 EF 核心的原始 sql 和 return 一组行进行查询。

我在我的 Postgresql 中创建了一个名为 show() 的函数(用于测试目的)

我用这段代码创建了函数:

CREATE OR REPLACE FUNCTION public.show()
    RETURNS SETOF city
    LANGUAGE 'plpgsql'
    VOLATILE
    PARALLEL UNSAFE
    COST 100    ROWS 1000 
    
AS $BODY$
BEGIN
       RETURN QUERY SELECT * FROM City;                                                     
 END;
$BODY$;

我的 C# 代码中有这个:

var listOfCities = _context.Database.FromSqlRaw("SELECT public.show()").ToList();

.FromSqlRaw:

部分出错

'DatabaseFacade' does not contain a definition for 'FromSqlRaw' and no accessible extension method 'FromSqlRaw' accepting a first argument of type 'DatabaseFacade' could be found (are you missing a using directive or an assembly reference?)

-我不想使用任何 DbContext,因为它是一个自定义查询,可以 return 来自函数的任何对象。

我该如何解决这个问题?这可以用 EF 核心来完成吗?

您不能使用 dbcontext.Database.FromSqlRaw,因为 FromSqlRaw returns 项目列表,您只能对数据库使用 Database.ExecuteSqlCommand。

您必须为您的函数结果创建一个特殊的 DTO,它应该包括在您的数据库函数中选择的所有数据属性

public class SpCityResult
{
        public int Id { get; set; }
      
        public string Name { get; set; }
       
         ....... and so on

     
}

此 class 中的所有属性都应与您的函数中的名称和类型相同

将 SpCityResult 添加到数据库上下文

public virtual DbSet<SpCityResult> SpCityResults { get; set; }
......

modelBuilder.Entity<SpCityResult>().HasNoKey().ToView(null);

运行代码

var cities= _context.SpCityResults.FromSqlRaw("SELECT public.show()").ToList();

如果您现有的 City 模型具有与 db 函数相同的属性,则无需创建额外的 DTO。

你可以试试这个

var cities= _context.Cities.FromSqlRaw("SELECT public.show()").ToList();