代码之家  ›  专栏  ›  技术社区  ›  Colin Desmond

OData和EF4-同一查询的不同结果

  •  0
  • Colin Desmond  · 技术社区  · 15 年前

    我正在运行以下查询…

    (from txRx in TxRxes
    where txRx.Serial == "someSerial"
    select txRx).Single().TxRxModes.Count()
    

    当我使用linqpad中的ef4在数据库上运行这个函数时,我得到了返回1的正确结果。当我通过OData(使用相同的底层上下文)在同一个数据库上运行完全相同的查询时,我得到0。

    为什么?

    1 回复  |  直到 15 年前
        1
  •  1
  •   Vitek Karas MSFT    15 年前

    单命令强制查询在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。