C# 从数据库加载SQL Server表记录并通过WCF调用发送它们的最佳方法

C# 从数据库加载SQL Server表记录并通过WCF调用发送它们的最佳方法,c#,wcf,entity-framework,linq-to-sql,C#,Wcf,Entity Framework,Linq To Sql,我主要需要将数据库表从一台机器移动到另一台机器 重要提示:服务器只能通过WCF访问,因此我无法使用SQL server镜像或其他直接SQL server技术 我需要在客户机上加载整个表并进行准备,以便以优化的方式通过WCF发送 客户机(和服务器)基于C#,我可以使用客户机上可用的任何技术(EF4、Linq2SQL…)来加载和准备数据 在服务器上,我也使用C#,但我只能通过WCF接收表行 同样,我只能通过WCF访问服务器,因此目前没有其他可用选项 问题: 1) 那么,将这些表加载到客户端并为WCF

我主要需要将数据库表从一台机器移动到另一台机器

重要提示:服务器只能通过WCF访问,因此我无法使用SQL server镜像或其他直接SQL server技术

我需要在客户机上加载整个表并进行准备,以便以优化的方式通过WCF发送

客户机(和服务器)基于C#,我可以使用客户机上可用的任何技术(EF4、Linq2SQL…)来加载和准备数据

在服务器上,我也使用C#,但我只能通过WCF接收表行

同样,我只能通过WCF访问服务器,因此目前没有其他可用选项

问题:
1) 那么,将这些表加载到客户端并为WCF调用做好准备的最佳方法是什么呢

2) 更重要的是,传递表记录的WCF参数是什么样子的


谢谢

Well EF是微软推荐的数据访问方法。您可以使用linq to实体来查询ef,而不带任何条件,并在WCF方法中返回该条件。虽然我不得不说,这是有点明显的,表中的记录越多,WCF服务运行的速度就越慢,因为所有数据都必须序列化

这里有一个链接可以帮助您一起开始EF和WCF


如果您不能使用任何数据库技术,那么最好的选择可能是将linq的TAKE和SKIP参数与实体框架一起分块使用


但实际上,如果需要复制表,我会认真考虑使用数据库工具(针对Sql Server-BCP),将数据移出文件,然后移入另一台服务器上的暂存表。然后使用MERGE将数据从暂存移动到生产。

如何从数据库中获取数据并不重要-使用任何快速和轻量级的方法,例如预编译的Linq to SQL查询或常规ADO.Net

编辑:或将其转储到@John Raynor提到的文件中)

如果你有大量的数据要移动,那么我首先要考虑流,而不是标准的WCF缓冲(可能只针对初始传输-取决于数据的大小)。这将避免在客户端和服务器上使用太多资源,因为它们不必一次性缓冲所有数据

以下是有关使用WCF进行流式处理的良好指南:

如果防火墙不是问题,您应该使用TCP而不是HTTP,因为它更紧凑

要考虑的另一个问题是要使用的编码类型。由于您控制系统的两侧(客户机和服务器),因此可以使用二进制编码。标准的.Net是可以的,但是如果你能花点钱,我发现noemax的快速信息集编码非常好


WCF可以序列化
系统.Data.DataTable
。你基本上可以:

[ServiceContract]
public interface ITableReader
{
  [OperationContract]
  DataTable GetTable();
}
并使用ADO.NET将整个表读入一个
DataTable


如果表非常大,您可以将其拆分为多个CAL以获得表的块,但是如果需要,WCF将不存在发回几十个MEG的问题。您只需在绑定配置上增加消息大小。

这听起来像是最好用ADO.NET解决的问题,而不是尝试使用实体框架。这些表中有多少记录?可能是第一次1000条,然后…因为它是一个定时客户端,只是上次上传的增量。通过ADO.NET意味着直接的数据读取器,对吗?我应该以什么格式通过WCF发送表?这也只是为了将数据从一台服务器迁移到另一台服务器,而不是为了用户组访问。如果是这样,您可以使用数据库镜像或其他技术。我知道你们提到只有通过web服务才能访问,但我想我至少会看到。对……所以我在客户端和服务器之间的唯一连接是通过WCF。因此,对于EF加载,建议将var xx.ToArray()作为参数传递给WCF调用?-1:返回EF实体是个坏主意。它们将包括特定于实现的数据,如基类。使用EF,您可以首先使用代码并创建POCO类。当你这么做的时候,你的建议和我做的没有什么区别。另外,这听起来像是在她的网络中严格执行的,所以只要它不传递连接字符串信息,那又有什么关系呢?我不明白为什么在WCF服务中返回EF实体是不好的。这是web开发的基本要求。另外,如果情况不好,他们为什么要提供只返回实体的RIA服务?非常有用的答案…谢谢。最后,WCF调用应该有一个参数,例如什么类型(对于一个名为Users的表),它应该是Stream类型。其思想是将结果集序列化,无论结果集是什么,都将其序列化到流中并发送。我认为处理大数据的最佳方法是将其转储到一个文件和流中,这样您就可以将数据提取到一个文件中,然后打开一个文件流到该文件并返回该文件。为了确保我理解……假设我们使用的是Linq2SQL,是否有一种特殊的方法来创建该文件并将其转换为流?嗯,根据我的编辑,我会使用John Raynor推荐的BCP方法,而不是L2SQL。-1:是的,它可以做到这一点,但不应该。如果没有必要,为什么要将此合同平台具体化?使用
DataTable
而不是像
List
这样的特定于平台的东西是否有一些性能优势?@John Saunders:我没有使用EF4,所以这可能已经改变了,但我的印象是EF实体(在EF1中)在默认情况下是不可序列化的。我只是提出了一个非常简单的解决方案。EF实体总是可序列化的,我也不会使用它们。@JohnSaunders By RecordType you suggest