在什么情况下我需要使用CREATEREF,DEREF和REF关键字?

时间:2012-03-04 16:25:13

标签: entity-framework entity-sql

这个问题是为什么我会使用上述关键字。我发现很多MSDN页面都解释了如何。我正在寻找原因。

我想写什么查询,这意味着我需要它们?我问,因为我发现的例子似乎可以用其他方式实现......

为了尝试自己弄清楚,我使用AdventureWorks数据库中的Employee和EmployeePayHistory表创建了一个非常简单的实体模型。

我在网上看到的一个例子展示了类似于以下实体SQL的内容:

SELECT VALUE
    DEREF(CREATEREF(AdventureWorksEntities3.Employee, row(h.EmployeeID))).HireDate
FROM 
    AdventureWorksEntities3.EmployeePayHistory as h

这似乎在不必指定连接的情况下撤回HireDate?

为什么这比下面的SQL更好(看起来完全一样)?

SELECT VALUE
    h.Employee.HireDate
FROM 
    AdventureWorksEntities3.EmployeePayHistory as h

看看上面的两个陈述,我无法弄清楚CREATEREF,DEREF位正在添加什么,因为我似乎能够在没有它们的情况下得到我想要的东西。

我假设我没有找到证明目的的场景。我假设有些情况下使用这些关键字要么更简单,要么是实现所需结果的唯一方法。

我找不到的是场景......

任何人都可以填补空白吗?我不需要整套SQL。我只需要一个起点来玩,即对一两个场景的简要描述......我可以自己进行扩展。

2 个答案:

答案 0 :(得分:1)

看看这个post

  

引用的一个好处是它可以被认为是一个“轻量级”实体,在这个实体中我们不需要花费资源来创建和维护完整的实体状态/值,直到确实需要它为止。一旦你有一个实体的引用,你可以通过使用DEREF表达式或仅通过调用实体的属性来取消引用它

答案 1 :(得分:1)

TL; DR - REF / DEREF类似于C ++指针。它们是对持久化实体的引用(不是未保存到数据源的实体)。

为什么要使用这样的东西?:对实体的引用比使用DEFEF(或扩展;或填充;或实例化)实体使用更少的内存。如果您有一堆包含图像信息和图像数据的记录(数据库中存储了4GB文件),这可能会派上用场。如果您没有使用REF,并且为了获取图像元数据而撤回了其中10个实体,那么您很快就会填满你的记忆。

我知道,我知道。在您的查询中撤回元数据会更容易,但是您会失去REF有利于什么的点:-D