代码之家  ›  专栏  ›  技术社区  ›  Luis Abreu

EF Core 8:执行查询并将其映射到非实体

  •  2
  • Luis Abreu  · 技术社区  · 1 年前

    看来EF Core 8应该允许 raw SQL queries for unmapped types ,但我不确定如何将其用于复杂类型。

    例如,假设您有以下内容:

    public class A
    {
        public int Id { get; set; }
    
        public B B { get; set; }
    
        // other properties
    }
    
    public class B 
    {
        public int IdB { get; set; }
        public int Description { get; set; }
    }
    

    SQL看起来是这样的:

    SELECT 
        ..., 
        SomeColumn as IdB, 
        SomeDescription as Description,
        ...
    FROM
        Summary
    

    哪里 IdB Description 应用于创建的实例 B 对于每一行。

    我试着逃脱惩罚:

    List<dynamic> toConvert = await _dbContext.Database.SqlQueryRaw<dynamic>(sql, parameters)
                                                                  .ToListAsync( );
    

    这显然不起作用。有没有办法将此查询映射到期望的类型,而不必求助于低级命令和数据读取器?

    谢谢

    1 回复  |  直到 1 年前
        1
  •  2
  •   Guru Stron    1 年前

    不,目前这似乎没有得到EF的支持。要使用未映射的类型,您需要有一个平面类型,否则会出现以下错误( source code ):

    使用“SqlQuery”时不支持导航。请在模型中包含此类型并对查询使用“FromSql”,或者使用“[NotMapped]”特性忽略此属性。

    例如,EF在内部为这种类型的映射使用了非常有限的约定子集 removing things like owned types 还有更多。

    选项:

    1. 创建一个中间类型以包含结果的展开版本,并将其映射到目标类型。

    2. 使用 Dapper 对于这个特定的查询,AFAIK支持这种类型的映射。

    3. 研究映射这种类型,例如在某种类型中 keyless entity type 可能与结合 complex type (TBH我有点惊讶他们在这种情况下不受支持,可能值得请求支持)