通过WCF服务公开IQueryable

时间:2010-11-27 11:22:20

标签: linq wcf iqueryable deferred-execution custom-linq-providers

我一直在学习IQueryable和延迟加载/延迟执行查询。

是否可以通过WCF公开此功能?我想公开一个返回IQueryable的LINQ-to-SQL服务,然后我可以在客户端执行其他查询,最后使用.ToList()执行。 OData格式在这种情况下是否适用?

如果可能的话,这项技术的术语是什么?我可以遵循哪些好的教程?谢谢。

6 个答案:

答案 0 :(得分:11)

您应该检查WCF Data Services,这将允许您在客户端上定义Linq查询。 WCF数据服务可能是满足您需求的唯一解决方案。

IQueryable仍然只是接口,功能取决于实现接口的类型。您无法直接公开Linq-To-Sql或Linq-To-Entities查询。有很多原因,例如短生活上下文或序列化将执行查询,因此客户端将获得所有对象的列表而不是查询。

答案 1 :(得分:1)

据我所知,datacontext不可序列化,这意味着你不能用WCF传递它

答案 2 :(得分:1)

您可以使用http://interlinq.codeplex.com/,它允许您通过WCF发送Linq查询。

WCF数据服务只能与webHttpBinding一起使用,并不能表达所有Linq查询。在使用WCF数据服务时编写查询不是那么有吸引力 - 需要字符串表达式,例如:

.AddQueryOption("$filter", "Id eq 100");

答案 3 :(得分:1)

https://remotelinq.codeplex.com/是另一种选择。但它适用于AppDomain以扫描当前程序集并序列化它们。这项技术不适合WinRT,因为WinRT App没有域名

答案 4 :(得分:0)

我一直在努力解决同样的问题,并意识到一个形成良好的问题已经解决了问题。

IQueryable基本上用于在将查询发送到您的数据库调用之前过滤查询,因此不是获取1000条记录而只过滤10条,而是开始使用10条。该过滤属于您的服务层,但如果您正在构建API,我会假设您将使用您的URL中的AND / OR参数映射它。

HTTP:// {主机} / {实体} / Q名称=约翰&安培;年龄= 21

所以你最终得到这样的东西:

Filter:Column1=Value1 > http://{host}/{entity}q?column1=value1 >  SELECT *
                                                                  FROM  Entity
                                                                  WHERE Column1=Value1

MVC                   > WCF                                    >  DB

你可以找到一个非常好的样本[here]

最后,由于来自WCF的有效负载很可能是JSON,因此您可以(并且应该)在集合内的域模型中对它们进行反序列化。直到这一点发生分页,所以我建议一些WCF缓存(因为它的HTTP,它真的很简单)。你仍然会在WebApp方面使用LINQ,只是没有“WHERE”LINQ子句(除非你想动态创建上面表达的URL?)

对于复杂的OR查询,您最终会想到多个WCF查询(每个“AND”1个),然后将它们连接在一起

答案 5 :(得分:-1)

如果可以发送IQuerable<>因为IQuerable<>所以在WCF上安全性并不是一件好事。可以将连接字符串等内容暴露给数据库。 之前的一些评论似乎很有希望。