【问题标题】:WCF Data Services query projection with nullable navigation properties具有可为空导航属性的 WCF 数据服务查询投影
【发布时间】:2013-01-26 15:55:16
【问题描述】:

我正在尝试针对 WCF 数据服务编写一个查询,该服务执行包含可为空导航属性的投影(即基础数据模型中的 FK 列可以为空,因此关联为 0..1)。项目语言是 VB.NET,不是我选择的。查询示例部分:

From t In DataServiceReference.Context.Transactions
Where t.ID = transactionID
Select
    CSM = t.WrittenByEmployee.Name, _
    t.CustomerFirstName

当针对 WrittenByEmployee 为空的行执行此查询时,如预期的那样,我收到以下错误:

导航属性“WrittenByEmployee”返回的条目为空且无法初始化。在访问此属性之前,您应该检查空值。

根据this blog,在 C# 中可以使用三元 ?: 运算符进行条件空检查。然而,遗憾的是该项目是在 VB.NET 中,而不是 C#。我知道 VB 中的等价物是 If() 运算符,但它似乎没有按预期工作。如果我将上述查询更改为:

Select
    CSM = If(t.WrittenByEmployee IsNot Nothing, t.WrittenByEmployee.Name, String.Empty)

我在运行时收到此错误:

不支持使用表达式 (t.WrittenBy Employee != null) 构造或初始化类型 (...) 的实例

我尝试反转测试,但得到了类似的错误,只是用 (t.WrittenByEmployee == null) 代替。

如何编写此查询,以数据服务可以接受的方式检查 WrittenByEmployee 导航属性中的空值?

【问题讨论】:

    标签: wcf-data-services


    【解决方案1】:

    感谢一位同事指出,当导航属性为 null 时,链接的博客返回的是 null 而不是常量!

    如果将上面的代码更改为在导航属性为 null 时返回 null/Nothing,则在 C# 和 VB.NET 中有效!

    Select
        CSM = If(t.WrittenByEmployee IsNot Nothing, t.WrittenByEmployee.Name, Nothing)
                                                                              ^^^^^^^
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2022-11-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多