向一个巨大的非数据库数据集提供oData访问

4
我有一个非常大的数据集(1,000,000+客户)存储在远程计算机上的数据集中。这些数据存储在平面文件中,并通过客户号进行查找,该客户号是文件偏移量。我想提供对此集合的oData访问,但我只想提供读取单个实体的能力。
从权限角度来看,使用以下代码很容易将WCF限制为单个读取:
config.SetEntitySetAccessRule("Customer", EntitySetRights.ReadSingle);

我的问题是我被迫返回一个IQueryable接口,这似乎要求我收集整个数据集。我是否遗漏了什么,或者在评估IQueryable时只收集所需记录的方法,我知道(由于oData权限)将需要单个记录获取?


这只是一个旁注,但你的行有多宽?我假设这个数据集在内存中加载是微不足道的(500MB?),这是你在场景中应该考虑的事情。基于文件的I/O会对性能造成巨大影响;大多数数据库通过将热记录保留在内存中来缓解这种影响。 - Mark Stafford - MSFT
1个回答

1
IQueryable和IEnumerable非常不同 - 不过不详细解释,IQueryable允许您构建一个查询表达式,由查询提供程序(在服务器上)执行并仅返回结果(在您的情况下,是单个实体)。您仍将承担在服务器端检查整个数据集的影响,但我不确定在您的情况下如何避免这种情况。
有关IEnumerable和IQueryable之间差异的更多详细信息,请参见此处的答案:https://dev59.com/rnVC5IYBdhLWcg3wjx_u#252789。具体来说,“... IQueryable允许像远程数据源(例如数据库或Web服务)这样的超出内存的事物。”

太棒了!我创建了一个实现了IQueryable和IEnumerable的类。当你运行LINQ时,它使用IQueryable来收集查询的WHERE部分,这里是客户编号。LINQ实际上并不收集数据,它只收集查询的参数。然后,当你创建一个枚举器时,我才会实际收集数据。此时,我可以访问条件,因此我可以仅返回服务器上的结果!再次感谢 - Dale Bruce Hopkins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接