我正在运行以下查询......
(from txRx in TxRxes
where txRx.Serial == "someSerial"
select txRx).Single().TxRxModes.Count()
当我在LinqPad中使用EF4在数据库上运行它时,我得到了1的正确结果。当我通过oData在同一个数据库上运行完全相同的查询时(使用相同的底层上下文),我得到0。
为什么?
答案 0 :(得分:1)
Single强制查询在它之前在OData中执行(技术上它是WCF数据服务)。因此,发送到服务器的查询只是选择具有指定序列的txRx。与EF的不同之处在于EF将延迟加载导航属性(在您的情况下是TxRxModes),因此当您访问它以计算它时,它可以工作。 WCF数据服务不执行延迟加载,因为它可能非常昂贵(对远程服务器的HTTP请求),因此TxRxModes只是一个空集合。 要解决此问题,您应该能够修改代码以预加载有问题的导航属性(如此急切的加载):
(from txRx in TxRxes.Expand("TxRxModes")
where txRx.Serial == "someSerial"
select txRx).Single().TxRxModes.Count()
请注意额外的Expand调用,它会导致查询不仅从服务器中提取txRx,还会提取其所有相关的TxRxModes(在一个查询中)。