12

我一直在学习关于IQueryable和延迟加载/延迟执行查询。通过WCF服务公开IQueryable

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

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

+0

对于Silverlight,您可以使用WCF RIA服务 – RichardOD 2012-02-26 18:18:06

回答

11

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

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

+0

谢谢,这就是我一直在寻找的东西。 – Trust 2010-11-27 11:51:54

1

,据我所知,在DataContext是不可序列化的意思,你无法通过它与周围WCF

1

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

WCF数据服务只能与webHttpBinding一起使用,并不是所有的Linq查询都可以表示。当使用WCF数据服务编写查询也不是那么吸引人 - 需要字符串表达式,如:

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

我一直在挣扎了同样的问题,并认识到,一个良好形成的问题是亟待解决的问题。

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

http:// {host}/{entity}/q?name = john & age = 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),然后将它们连接在一起

-1

如果可以通过WCF发送IQuerable <>这不是安全明智的好事,因为IQuerable <>可能会将连接字符串等内容暴露给数据库。 虽然以前的一些评论看起来很有希望。

+0

“这不是一个好的安全明智的事情......”这不是依赖于`IQueryable`实现的具体方式吗? – Crono 2015-06-12 18:33:11

1

https://remotelinq.codeplex.com/是另一种选择。但它在AppDomain中工作以扫描Current Assemblies并序列化它们。此技术不适用于WinRT,因为没有WinRT域的应用程序