【问题标题】:How to move from LINQ to SQL to "LINQ to WCF"?如何从 LINQ 转移到 SQL 到“LINQ 到 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 数据服务”模板。我怎样才能得到它?

标签: wpf linq wcf linq-to-sql


【解决方案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 服务上。

        【讨论】:

          猜你喜欢
          • 2010-10-10
          • 2010-09-25
          • 1970-01-01
          • 2019-05-29
          • 1970-01-01
          • 2011-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多