我一直在学习IQueryable和延迟加载/延迟执行查询。
是否可以通过WCF公开此功能?我想公开一个返回IQueryable的LINQ-to-SQL服务,然后我可以在客户端执行其他查询,最后使用.ToList()执行。 OData格式在这种情况下是否适用?
如果可能的话,这项技术的术语是什么?我可以遵循哪些好的教程?谢谢。
答案 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上安全性并不是一件好事。可以将连接字符串等内容暴露给数据库。 之前的一些评论似乎很有希望。