【问题标题】:WCF Data Services and Projections. How to get the entity URI from an entity projection instance?WCF 数据服务和投影。如何从实体投影实例中获取实体 URI?
【发布时间】:2010-08-30 10:27:06
【问题描述】:

我正在使用 DataServiceContext 加载一些实体投影(实体有很多属性,为了尽量减少流量,我只加载目前需要的那些属性),如下所示:

from x in ctx.Portfolios
       select new 
       {
         Id = x.Id,
         Name = x.Name,
         PortfolioName = x.PortfolioName,
         Description = x.Description,
         ValidFrom = x.ValidFrom,
         ValidUntil = x.ValidUntil
       };

我需要的是实体的有效 URI 来加载它以查看详细信息。

我尝试使用 ctx.TryGetUri(obj, out uri),但它总是返回 null(可能是因为非跟踪投影,但是,我已经加载了 PK 属性(Id),所以它必须不是这样)。

问题是,我如何确定底层数据实体的 URI,有一个带有 PK 的投影对象?

【问题讨论】:

    标签: .net-4.0 wcf-data-services astoria


    【解决方案1】:

    在 C# 中,匿名类型是使用不可设置的属性生成的(这些属性没有设置器)。因此,WCF 数据服务客户端无法跟踪这些(因为它没有任何意义,它无法在实现期间覆盖属性值)。所以结果是实例没有被跟踪。 要解决此问题,只需声明一个具有您需要的属性的非匿名类并将其投影到该类中(确保属性是可设置的)。 请注意,VB 的匿名类型确实具有可设置的属性,因此它们会被跟踪。

    【讨论】:

    • 我不需要设置加载的属性。我只需要获取实体的正确 URI 即可在其他数据上下文中加载其完整版本(不是投影)以进行编辑。
    • 如果你只对URI感兴趣,那么不要投影任何东西,只需选择整个实体,然后使用DataServiceContext.GetEntityDescriptor()获取你可以在其中找到的实体的描述符SelfLink 和 EditLink 属性存储指向该实体的 URI(第一个用于读取,第二个用于编辑)。
    • 我需要预测来加载按业务实体的轻量级列表以显示在 UI 上。当用户双击选定的投影时,我需要加载一个完整的(200 列)实体。
    • 那么最简单的方法是声明一个只包含给定实体的几个属性的类,并在投影中使用它。但如果你在 C# 中,你必须手动定义该类并设置属性。
    猜你喜欢
    • 2015-12-25
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 2017-08-25
    • 2020-11-19
    • 1970-01-01
    相关资源
    最近更新 更多