如何从 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 查询输出的特定 json 响应?