如何从 LINQ 转移到 SQL 到“LINQ 到 WCF”?

Posted

技术标签:

【中文标题】如何从 LINQ 转移到 SQL 到“LINQ 到 WCF”?【英文标题】:How to move from LINQ to SQL to "LINQ to WCF"? 【发布时间】:2010-10-05 10:05:14 【问题描述】:

我正在组装一个 WPF 应用程序,该应用程序最终将使用 WCF Web 服务作为其数据源。

在原型设计阶段,我在 SQL 2008 数据库上使用 LINQ to SQL,并开始欣赏我可以轻松地执行“添加新项目 | LINQ to SQL 类”并为表生成模型类,然后使用 LINQ 与它对话并将其传递给我的 XAML UI,非常好。

但是当我们将数据源从 SQL Server 切换到 WCF Web 服务时会发生什么?为了继续使用 LINQ,我是否必须:

手动编写我自己的 LINQ-to-web-service 类(使用 IQueryable 等?) 是否有执行此操作的代码生成工具,例如“LINQ-to-WCF”(奇怪的是,这个术语甚至在 Google 中都没有出现) 还是我必须低效地从我的 Web 服务中获取大量记录,从中创建对象,然后使用 LINQ-to-objects 来查询它们?

感谢您在此处提供的任何指导。

添加:感谢您的回答,非常有帮助,但导致了一些混乱:

MSDN tutorial 表示“添加新项目 | ADO.NET 实体数据服务” 我有 VS2008,可以执行“添加新项目 | ADO.NET 实体数据模型” 这个MSDN video 说要使用我在 VS2008 中没有的 ADO.NET 数据服务 模板创建一个新项目 所有这些最常用的有什么区别? 从我目前所读到的内容来看,与“LINQ to Entities”有关的任何事情都需要成本,而“LINQ to SQL”是免费的,所以上面的“实体数据服务/模型”选项与 LINQ 相关实体?

【问题讨论】:

看起来您需要 Visual Studio 2008 SP1 来进行这些更改,因为它们需要 3.5 SP1。 我安装了 Visual Studio 2008 SP1 但仍然需要“ADO.NET 数据服务”模板。我怎样才能得到它? 【参考方案1】:

您可能需要ADO.NET Data Services。您必须将IUpdatable 接口实现添加到您的实体,并且可以使用LINQ to SQL、实体框架、SubSonic 或其他一些。我们正在使用CodeSmith PLINQO templates,它允许您将此功能添加到 LINQ to SQL。

【讨论】:

【参考方案2】:

你看过ADO.NET Data services。在这里,您可以使用 linq 语法通过网络查询数据存储。

您将保留 LINQ to SQL 数据上下文,但将其公开给 Web,并允许您的客户端在标准 LINQ 语句中查询上下文。您显然必须保护数据服务,以便只有授权客户端才能连接,但基本上只需最少的工作,您就可以让您的数据上下文“客户端”可以这么说。

【讨论】:

【参考方案3】:

通用 LINQ to WCF 可能没有意义。特别是,WCF 调用仅以非常特定的方式公开数据,这并不真正符合 LINQ 的处理方式。例如,我的服务可能有以下合同:

List<DAO> GetObjectsInDateRange(DateTime start, DateTime end);
void ExportObjectsToLegacySystem(List<DAO> data);

您如何以 LINQ 格式表达。特别是当 start 和 end 不是 DAO 的成员时。表达它的唯一方法是服务公开一个 IQueryable 接口,我不知道这有多大可能。

现在,你总是可以这样做:

var data = from dao 
in wcfService.GetObjectsInDateRange(DateTime.Today,DateTime.Today.AddDays(50))
where dao.AmountOfStuff > 20
select dao;

话虽如此,您当然可以创建一个适合您自己的服务的 LINQ 接口。假设您的服务有一个方法:

List<DAO> GetObjects(DAOFilter filterObject);

其中 DAOFilter 是一个指定所有“位置”条件的对象,您可以做的是编写一个 LINQ 提供程序,将所有表达式转换为此 DAOFilter 对象。这将是一个令人难以置信的一次性解决方案,需要大量工作,因此我建议不要这样做。

我附和建议看看ADO.Net Data Services。

【讨论】:

【参考方案4】:

您可以将 Linq to SQL 类直接添加到 WCF 项目,并将 Linq to SQL 类上的序列化模式设置为单向。如果您这样做,这些类将显示在 WCF 服务上。

【讨论】:

以上是关于如何从 LINQ 转移到 SQL 到“LINQ 到 WCF”?的主要内容,如果未能解决你的问题,请参考以下文章

从LINQ到SQL获取SQL查询?

创建从 linq 到 SQL 查询输出的特定 json 响应?

在啥情况下,我想创建从 Linq 到 Sql 结果的自定义业务对象?

LINQ 到 SQL。如何防止使用 Apply 运算符

将结果集导出到 linq 到 sql 的 excel

关于 Linq 到 SQL 映射对象设计的建议