我正在尝试针对WCF数据服务编写查询,该服务执行包含可空导航属性的投影(即基础数据模型中的FK列可以为空,因此关联为0..1)。项目语言是VB.NET,不是我选择的。查询的示例部分:
From t In DataServiceReference.Context.Transactions
Where t.ID = transactionID
Select
CSM = t.WrittenByEmployee.Name, _
t.CustomerFirstName
当针对WrittenByEmployee为null的行执行此查询时,我得到以下错误,正如人们所期望的那样:
导航属性“WrittenByEmployee”返回的条目为null,无法初始化。您应该在访问此属性之前检查空值。
根据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)。
如何组合此查询以Data Services将接受的方式检查WrittenByEmployee导航属性是否为空?
答案 0 :(得分:1)
感谢一位同事指出,当导航属性为null时,链接的博客返回null而不是常量!
如果在导航属性为null时更改上面的代码以返回null / Nothing,则它在C#和VB.NET中工作!
Select
CSM = If(t.WrittenByEmployee IsNot Nothing, t.WrittenByEmployee.Name, Nothing)
^^^^^^^