我一直在学习 IQueryable 和延迟加载/延迟执行查询。
是否可以通过 WCF 公开此功能?我想公开一个返回 IQueryable 的 LINQ-to-SQL 服务,然后我可以在客户端执行其他查询,最后使用 .ToList() 执行。OData 格式在这种情况下是否适用?
如果可能的话,这种技术的术语是什么?我可以遵循哪些好的教程?谢谢你。
我一直在学习 IQueryable 和延迟加载/延迟执行查询。
是否可以通过 WCF 公开此功能?我想公开一个返回 IQueryable 的 LINQ-to-SQL 服务,然后我可以在客户端执行其他查询,最后使用 .ToList() 执行。OData 格式在这种情况下是否适用?
如果可能的话,这种技术的术语是什么?我可以遵循哪些好的教程?谢谢你。
您应该检查WCF 数据服务,这将允许您在客户端上定义 Linq 查询。WCF 数据服务可能是满足您要求的唯一解决方案。
IQueryable 仍然只是接口,功能取决于实现接口的类型。您不能直接公开 Linq-To-Sql 或 Linq-To-Entities 查询。有多种原因,例如短暂的上下文或序列化将执行查询,因此客户端将获取所有对象的列表而不是查询。
据我所知,数据上下文不可序列化,这意味着您无法使用 WCF 传递它
您可以使用http://interlinq.codeplex.com/,它允许您通过 WCF 发送 Linq 查询。
WCF 数据服务只能与 webHttpBinding 一起使用,并不是所有的 Linq 查询都可以表达。在使用 WCF 数据服务时编写查询并不那么吸引人 - 需要字符串表达式,例如:
.AddQueryOption("$filter", "Id eq 100");
https://remotelinq.codeplex.com/是另一种选择。但它可以在 AppDomain 中扫描当前程序集并序列化它们。该技术不适用于 WinRT,因为 WinRT 应用程序没有域
我一直在为同样的问题而苦苦挣扎,并意识到一个格式良好的问题是一个已解决的问题。
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
你可以找到一个很好的样本 [这里]
最后,由于来自 WCF 的有效负载很可能是 JSON,因此您可以(并且应该)在集合内的域模型中反序列化它们。直到此时应该发生分页,所以我会推荐一些 WCF 缓存(并且由于它的 HTTP,它真的很简单)。您仍将在 WebApp 端使用 LINQ,只是没有“WHERE”LINQ 子句(除非您想动态创建上面表达的 URL?)
对于复杂的 OR 查询,您介意最终使用多个 WCF 查询(每个“AND”1 个),然后将它们连接在一起
如果可以通过 WCF 发送 IQuerable<> ,那么从安全角度来看,这并不是一件好事,因为 IQuerable<> 可能会将诸如连接字符串之类的东西暴露给数据库。不过,之前的一些评论似乎很有希望。