【问题标题】:How to get results from a Postgresql function using EF Core?如何使用 EF Core 从 Postgresql 函数中获取结果?
【发布时间】:2021-10-24 19:53:19
【问题描述】:

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

我在我的 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”不包含“FromSqlRaw”的定义,并且没有 可访问的扩展方法“FromSqlRaw”接受第一个参数 可以找到类型“DatabaseFacade”(您是否缺少使用 指令还是程序集引用?)

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

  • 我知道这可以通过使用 LINQ _context.Cities.ToList() 来完成,但我正在尝试测试和学习如何使用原始 sql WITH 参数和无参数的函数。

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

【问题讨论】:

  • 您有using Microsoft.EntityFrameworkCore.Infrastructure 声明吗?
  • 是的,但它没用,我试过这个_context.Cities.FromSqlRaw 并且没有错误,但因为Cities 是来自 Context 的表,我不想使用表进行映射,只是自定义 DTO。因为我没有 DTO,所以我使用了.Database。也许我现在知道我在做什么了。

标签: c# postgresql asp.net-core .net-core plpgsql


【解决方案1】:

您不能使用 dbcontext.Database.FromSqlRaw,因为 FromSqlRaw 返回项目列表,您只能将 Database.ExecuteSqlCommand 与数据库一起使用。

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

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

     
}

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

将 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();

【讨论】:

  • 给了我这个错误'Cannot create a DbSet for 'SpCityResult' because this type is not included in the model for the context.',我将它包含在他的 dbcontext 中,也许它不是映射问题?
  • @Bluares 尝试删除 [NotMapped] 并让我知道结果。并添加到数据库上下文 modelBuilder.Entity().HasNoKey().ToView(null);
  • 好的,在尝试解决一些问题后开始工作,您的解决方案效果很好。
  • .HasNoKey 阻止创建表到数据库对吗?
  • @Bluares - 当您调用返回表的函数时,通常应该从from 子句调用它:select * from public.show()
猜你喜欢
  • 2020-09-11
  • 1970-01-01
  • 2022-10-23
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多