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