12

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

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

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

4

6 回答 6

11

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

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

于 2010-11-27T11:42:12.613 回答
1

据我所知,数据上下文不可序列化,这意味着您无法使用 WCF 传递它

于 2010-11-27T11:24:50.627 回答
1

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

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

.AddQueryOption("$filter", "Id eq 100");
于 2012-04-27T12:49:08.177 回答
1

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

于 2013-09-26T22:32:04.690 回答
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

你可以找到一个很好的样本 [这里]

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

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

于 2013-08-05T20:40:12.777 回答
-1

如果可以通过 WCF 发送 IQuerable<> ,那么从安全角度来看,这并不是一件好事,因为 IQuerable<> 可能会将诸如连接字符串之类的东西暴露给数据库。不过,之前的一些评论似乎很有希望。

于 2013-09-03T07:08:49.680 回答