【发布时间】: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<Ord>和Ord列? -
好的,所以
Ord实际上是一个实体。嗯,有趣,我不确定是否支持。 -
@gilliduck Dapper 会有同样的问题。问题是您无法将类
Ord映射到类TestQuery。这意味着查询返回了一个Ord类,但你要求的是一个TestQuery,这是没有意义的。
标签: c# sql entity-framework-core