最近发布的 Entity Framework Core 7.0 提供 a new DatabaseFacade.SqlQuery<T>
function ,它允许直接在底层数据库上下文上运行自定义 SQL 查询。
对于自定义 SQL 查询,我当前正在使用 Dapper ,我想用 EF 的新原生 SqlQuery
替换它功能。各个查询不能轻松地表示为 LINQ,而 EF 可以将其转换为 SQL 本身。此外,它们返回不属于数据库模型一部分的结果对象。
作为说明性示例,请使用这些简单的类和 SQL 查询:
public class Book // Mapped to database table 'books'
{
public int Id { get; set; }
public string Title { get; set; }
public int AuthorId { get; set; }
public Author Author { get; set; } // References some complex Author object
// ...lots of other properties...
}
// Simple type for search results
public class BookSearchResult
{
public string AuthorName { get; set; }
public string BookTitle { get; set; }
}
// Search for books which satisfy a complex query
var books = _dbContext.Database.GetDbConnection().QueryAsync<BookSearchResult>(@"
SELECT a.`Name` AS 'AuthorName', b.`Title` AS 'BookTitle'
FROM `books` b
JOIN `authors` a ON a.Id = b.AuthorId
...complex query...
");
我想将其替换为
var books = _dbContext.Database.SqlQuery<BookSearchResult>(@"
...same query...
");
现在,documentation of SqlQuery
还说明了以下内容(我添加的粗体格式):
Creates a LINQ query based on a raw SQL query, which returns a result set of a scalar type natively supported by the database provider.
也就是说,它只能/应该用于查询标量类型,但不能用于查询自定义对象。
注释中暗示可以定义一种新的默认类型映射,但我不太明白在实践中如何实现这一点(或者是否可能)。
我可以映射 DbConnection.Database.SqlQuery<T>
的结果吗?调用自定义对象?如果是这样,怎么办?
最佳答案
目前(EF Core 7)还不能。
这是一个长期以来被要求的功能,最终随 EF Core 8 SQL queries for unmapped types 一起提供。 :
Tracked by Issue #10753: Support raw SQL queries without defining an entity type for the result
Value proposition: Applications can execute more types of SQL query without dropping down to ADO.NET or using third-party libraries.
Currently SQL queries must return a type in the model or a scalar type. In EF8, we plan to allow SQL queries that directly return types that are not contained in the EF model.
关于c# - 在 EF Core 7.0 中使用 Database.SqlQuery<T> 查询自定义类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75667392/