2

WCF/OData Web 服务 返回类型为的restfulvBeheer

在客户端,我创建了使用的方法:

        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 不会是一个问题,但是数据被 DevExpress 组件 (DXGrid) 使用,它无论如何都会执行 ToList()。

注意:在浏览器中执行查询:

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

返回一组预期的唯一项。

4

1 回答 1

7

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

有和没有的差异ToList()是出乎意料的。这只是枚举查询的一种方式,Linqpad 在执行Dump().

于 2013-04-11T20:26:45.400 回答