使用ODATA服务时重复项目

时间:2013-04-11 19:34:59

标签: c# linq .net-4.0 wcf-data-services

WCF / OData webservice 会返回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 应该是每个“行”的唯一值:

right

但是当添加.ToList()时出错了

 vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19   ).ToList().Dump();

这导致许多重复(没有任何模式?)项目

enter image description here

此行为是意外且不需要的。而且更有趣。我们确定数据库返回正确的结果,在调试服务器时(在webservice中)结果仍然正确,但是当到达客户端时,它出现了可怕的错误。

IT不会成为问题,但数据由DevExpress组件(DXGrid)使用,无论如何都会执行ToList()。

nb:在浏览器中执行查询:

http://localhost:52671/SRTDataService.svc/vBeheer()?$filter=TrackID%20eq%2023%20and%20PersoonID%20eq%2019

返回一组预期的唯一项目。

1 个答案:

答案 0 :(得分:5)

这通常表示您的关键列(在EF模型中)具有非唯一的视图。 EF只是用一组键值重复它读取的第一行。

有{和1}的差异是出乎意料的。这只是一种枚举查询的方法,Linqpad在执行ToList()时也会这样做。