最近发布的 Entity Framework Core 7.0 提供了 一个新的
DatabaseFacade.SqlQuery<T>
功能,它允许直接在底层数据库上下文中运行自定义 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...
");
现在,SqlQuery
基于原始 SQL 查询创建 LINQ 查询,该查询返回数据库提供程序本机支持的 scalar 类型的结果集。
即,它可以/应该只用于查询标量类型,而不是自定义对象。
备注中有提示可以定义一个新的默认类型映射,但我真的不明白这在实践中是如何实现的(或者是否可能)。
我可以将
DbConnection.Database.SqlQuery<T>
调用的结果映射到自定义对象吗?如果是这样,怎么样?