如何使用 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 来自函数的任何对象。
- 我知道这可以通过使用 LINQ
_context.Cities.ToList()
来完成,但我正在尝试测试和学习如何使用带参数和不带参数的原始 sql 函数。
我该如何解决这个问题?这可以用 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();
我的问题 非常非常非常 简单,但我无法通过使用 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 来自函数的任何对象。
- 我知道这可以通过使用 LINQ
_context.Cities.ToList()
来完成,但我正在尝试测试和学习如何使用带参数和不带参数的原始 sql 函数。
我该如何解决这个问题?这可以用 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();