WCF/OData 网络服务 返回类型为 vBeheer
的 restful 项。
在客户端我创建了消费的方法:
SRTDBEntities es = new SRTDBEntities(_serviceRoot);
return es.vBeheer.Where(b =>
b.TrackID == trackid &&
b.PersoonID == CurrentPersoon.ID );
但是我注意到(经过一个下午的调试)当将 .ToList() 添加到表达式时,结果集会损坏。项目的 Count()
是正确的,符合预期,但项目的值是错误的。许多重复,许多缺失(很明显)。
所以我在 linqpad 中测试了这个:
vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19 ).Dump();
- 按预期从服务返回正确的结果,请注意 ID 应该是每个“行”的唯一值:
但是在添加 .ToList() 时出错了
vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19 ).ToList().Dump();
这会导致许多重复的(没有任何模式?)项目
此行为是意外且不需要的。甚至更有趣。我们确定数据库返回了正确的结果,在调试服务器(在 web 服务中)时结果仍然正确,但是当到达客户端时,却出现了可怕的错误。
IT 不会有问题,但数据由执行 ToList() 的 DevExpress 组件 (DXGrid) 使用。
nb: 在浏览器中执行查询:
http://localhost:52671/SRTDataService.svc/vBeheer()?$filter=TrackID%20eq%2023%20and%20PersoonID%20eq%2019
返回一组预期的唯一项。
最佳答案
这通常表示您的 View 包含不唯一的键列(在 EF 模型中)。 EF 只是用一组键值重复它读取的第一行。
不过,使用和不使用 ToList()
的区别是出乎意料的。这只是枚举查询的一种方式,Linqpad 在执行 Dump()
时也会这样做。
关于c# - 使用 ODATA 服务时出现重复项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15957334/