EF Core 8 及更高版本
EF Core 8 目前计划于 2023 年 11 月与 .NET 8 一起发布。
The SqlQueryEF Core 7.0中添加了该方法 https://learn.microsoft.com/ef/core/querying/sql-queries#querying-scalar-non-entity-types支持返回标量值。从 EF Core 8 开始,此方法还将支持返回任意类型 https://github.com/dotnet/efcore/issues/10753.
EF核心3.0
你需要使用无键实体类型 https://learn.microsoft.com/ef/core/modeling/keyless-entity-types?tabs=data-annotations,以前称为查询类型:
此功能是在 EF Core 2.1 中以查询类型的名称添加的。
在 EF Core 3.0 中,该概念已重命名为无键实体类型。这
[Keyless] 数据注释在 EFCore 5.0 中可用。
要使用它们,您需要首先标记您的班级SomeModel
with [Keyless]
数据注释或通过流畅的配置.HasNoKey()
方法调用如下:
public DbSet<SomeModel> SomeModels { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<SomeModel>().HasNoKey();
}
配置完成后,您可以使用其中一种方法在这里解释 https://learn.microsoft.com/ef/core/querying/sql-queries执行您的 SQL 查询。例如,您可以使用这个:
var result = context.SomeModels.FromSqlRaw("SQL SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();
EF 核心 2.1
如果您使用的是 2018 年 5 月 7 日起推出的 EF Core 2.1 Release Candidate 1,您可以利用提议的新功能,即查询类型 https://learn.microsoft.com/ef/core/modeling/query-types:
除了实体类型之外,EF Core 模型还可以包含查询类型,
它可用于对以下数据执行数据库查询
未映射到实体类型。
何时使用查询类型?
用作临时 FromSql() 查询的返回类型。
映射到数据库视图。
映射到未定义主键的表。
映射到模型中定义的查询。
因此,您不再需要执行所有建议作为问题答案的技巧或解决方法。只需按照以下步骤操作:
首先你定义了一个新的 type 属性DbQuery<T>
where T
是将携带 SQL 查询的列值的类的类型。所以在你的DbContext
你会得到这个:
public DbQuery<SomeModel> SomeModels { get; set; }
其次使用FromSql
像你一样的方法DbSet<T>
:
var result = context.SomeModels.FromSql("SQL_SCRIPT").ToList();
var result = await context.SomeModels.FromSql("SQL_SCRIPT").ToListAsync();
另请注意DbContext
s are 部分类 https://learn.microsoft.com/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods,因此您可以创建一个或多个单独的文件来组织最适合您的“原始 SQL DbQuery”定义。