【问题标题】:Entity Framework Core Query Type not mapping results to object实体框架核心查询类型未将结果映射到对象
【发布时间】:2019-02-23 03:33:07
【问题描述】:

我正在尝试使用 Entity Framework Core 2.1 中的新 DBQuery 功能执行 sql 查询。我的模型中有一个看起来像这样的实体:

public class Ord
{
    public Guid Id {get; set;}
    public Guid ColumnOne {get; set;}
    public Guid ColumnTwo {get; set;}
}

我创建了一个名为 TestQuery 的对象,如下所示:

public class TestQuery
{
    public Ord PatientOrder {get; set;}
}

我在我的数据库上下文类中添加了一个新的DBQuery,如下所示:

public DbQuery<TestQuery> TestQuery { get; set; }

然后,我尝试使用FromSql 执行查询,如下所示:

var query = "select PatientOrder.Id as PatientOrderId,
                    PatientOrder.ColumnOne as PatientOrderColumnOne,
                    PatientOrder.ColumnTwo as PatientOrderColumnTwo
             from Ord PatientOrder"

var test = await _context.TestQuery.FromSql(query).ToListAsync();

列表test 包含我期望的确切结果数量。但是,每个 TestQuery 对象只有一个空的 PatientOrder 属性。因此,查询似乎正在运行并返回结果,但未将结果映射到 PatientOrder 属性。

为了让这些数据正确映射到我的对象,我是否遗漏了一个步骤?

【问题讨论】:

  • 我知道的不够多,无法给出答案,但您的查询别名不应该是PatientOrder.Id as Id, PatientOrder.ColumnOne as ColumnOne吗?它无法映射,因为您的别名与属性的名称不同。另外,您尝试映射到包含实际属性作为子对象的对象似乎很奇怪。不应该在父级吗?
  • 如果我将 PatientOrder.Id 别名为 Id,实体框架会抛出错误 "The required column 'PatientOrderId' was not present in the results of a 'FromSql' operation." 所以我知道 EF 明确地期望该命名约定。
  • 问题是,TestQuery 的目的是什么?即,为什么不在 SQL 中使用 DbQuery&lt;Ord&gt;Ord 列?
  • 好的,所以Ord 实际上是一个实体。嗯,有趣,我不确定是否支持。
  • @gilliduck Dapper 会有同样的问题。问题是您无法将类 Ord 映射到类 TestQuery。这意味着查询返回了一个Ord 类,但你要求的是一个TestQuery,这是没有意义的。

标签: c# sql entity-framework-core


【解决方案1】:

你不能完全按照你正在做的事情per the documentation:

摘录:

SQL 查询不能包含相关数据。但是,在许多情况下,您可以使用 Include 运算符在查询之上进行组合以返回相关数据(请参阅包括相关数据)。

以下是相关数据:

public Ord PatientOrder {get; set;}

【讨论】:

    【解决方案2】:

    如果您正在查询具有相关数据PatientOrderTestQuery,则应使用Include

    https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#including-related-data

    var query = "/* do your query, but include the PatientOrderId */";
    var test = await _context.TestQuery.FromSql(query).Include(t=>t.PatientOrder).ToListAsync();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-10
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      • 2015-05-27
      相关资源
      最近更新 更多