在 EF Core 7.0 中使用 Database.SqlQuery 查询自定义类型<T>

问题描述 投票:0回答:0

最近发布的 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>
调用的结果映射到自定义对象吗?如果是这样,怎么样?

c# entity-framework entity-framework-core ef-core-7.0
© www.soinside.com 2019 - 2024. All rights reserved.