【问题标题】:Fetch records from parent table only, using Entity Framework仅从父表中获取记录,使用实体框架
【发布时间】:2016-10-29 11:21:59
【问题描述】:

我的项目中有以下实体(孩子多于两个):

当我使用TPT 策略进行继承时,有什么方法可以仅从父表加载记录(没有任何额外的连接),使用EF

通过以下代码:

var result = ctx.Parents.Find(5);
//or
var result = ctx.Parents.OfType<Parent>().Find(5);

EF 生成一个巨大的SQL 查询! (在我的真实模型中,我有两个以上的孩子)

【问题讨论】:

  • 你累了吗var result = ctx.Parents.Find(5);
  • @CodeNotFound: 是的,结果没有什么不同。
  • 也许你必须看看 SQL View :)

标签: c# performance entity-framework inheritance table-per-type


【解决方案1】:

无论您查询ctx.Parents 还是ctx.Parents.OfType&lt;Parent&gt;(),您总是要求EF 获取所有满足条件的Parent 实体(在本例中为Id == 5)。 EF 无法提前知道这将是子类型还是非子类型 Parent 实体(如果 Parent 不是抽象的,它可以),因此它总是必须执行完整的查询。

TPT 不是一个对查询非常友好的模型。我不会使用它(并尽可能避免继承)。

【讨论】:

  • 您认为哪种继承策略对查询更友好?
  • 另外两个TPH和TPC在这方面做得更好。
【解决方案2】:

创建没有任何属性的新子类

[Table("EmptyChild")]
public class EmptyChild: Parent
{

}

现在使用原始查询进行选择:

public Parent GetParent(Guid id)
{
    var parent = ctx.Database.SqlQuery<EmptyChild>("Select * from Parents where Id=@id", new SqlParameter("@id", id)).FirstOrDefault();

    return parent as Parent ;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多