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

发布于 2024-09-28 01:40:48 字数 254 浏览 2 评论 0原文

我正在运行以下查询...

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

当我在 LinqPad 中使用 EF4 在数据库上运行此查询时,我得到了正确的结果 1。当我通过 oData 在同一个数据库上运行完全相同的查询(使用相同的底层上下文)时,我得到 0。

为什么?

I am running the following query...

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

When I run this on the database using EF4 in LinqPad, I get the correct result of 1 back. When I run exactly the same query on the same database through oData (using the same underlying context) I get 0.

Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

很糊涂小朋友 2024-10-05 01:40:48

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,还提取其所有相关的 TxRxMode (在一个查询中)。

The Single forces the query before it to execute in OData (technically it's WCF Data Services). So the query sent to the server is just the selection of a txRx with the specified serial. The difference from EF is, that EF will lazy load navigation properties (in your case the TxRxModes) and thus when you access it to count it, it works.
WCF Data Services doesn't perform lazy load, since it could be very expensive (HTTP request to a remote server), and thus the TxRxModes is just an empty collection.
To work around this, you should be able to modify your code to preload the navigation property in question (so eager loading):

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

Note the additional Expand call which causes the query to pull not just the txRx but also all its related TxRxModes from the server (in one query).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文