使用ODATA服务时重复项目

Cas*_*jne 1 c# linq .net-4.0 wcf-data-services

WCF/Web服务的OData 返回宁静类型的项目vBeheer.

在客户端我创建了消耗的方法:

        SRTDBEntities es = new SRTDBEntities(_serviceRoot);
        return es.vBeheer.Where(b => 
            b.TrackID == trackid && 
            b.PersoonID == CurrentPersoon.ID );
Run Code Online (Sandbox Code Playgroud)

但是我注意到(在调试一个下午之后)将.ToList()添加到表达式时,结果集会损坏.该Count()项目是正确的,符合市场预期,但该项目的值是错误的.许多都是重复的,很多都丢失了(显然).

所以我在linqpad中测试了这个:

vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19   ).Dump();
Run Code Online (Sandbox Code Playgroud)
  • 按预期返回正确的服务结果,请注意ID应为每个"行" 的唯一值:

对

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

 vBeheer.Where (b => b.TrackID==23 && b.PersoonID == 19   ).ToList().Dump();
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

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

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

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

返回一组预期的唯一项.

Ger*_*old 5

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

然而,有和没有的差异ToList()是出乎意料的.它只是一种枚举查询的方法,Linqpad在执行时也会这样做Dump().