1

我正在尝试针对 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”返回的条目为空且无法初始化。您应该在访问此属性之前检查空值。

根据此博客,可以在 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) 代替。

如何编写此查询以以 Data Services 将接受的方式检查 WrittenByEmployee 导航属性中的空值?

4

1 回答 1

1

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

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

Select
    CSM = If(t.WrittenByEmployee IsNot Nothing, t.WrittenByEmployee.Name, Nothing)
                                                                          ^^^^^^^
于 2013-01-26T07:55:16.110 回答