欢迎大家都来讨论一下WCF和Linq的问题,本人菜鸟,请大虾解答。
首先我是一个菜鸟,说得不对,大家就当我没问过,呵呵。
现在做的项目是WinForm + WCF结构,WinForm基本上不与SQL Server打交道,纯粹基于DataSet的内存数据操作。
数据操作全部在WCF一端完成,现在通过Linq to SQL操作数据的时候遇到问题:
【WCF一端,如何在Linq to SQL查询到数据后,将查询结果序列化并返回给WinForm?】
网上看了很多资料,没有找到答案,身边也没有高手可以咨询。
目前的状态:
1、Linq to SQL操作的结果,不能直接转成DataTable或者DataSet,难道要手工写代码放到一个DataTable里面?这样肯定不行,太麻烦了,要操作的数据表有100多个啊。
2、有网友说通过toList()处理Linq to SQL的查询结果,然后再转换成DataTable,这其实也是与1一样的麻烦啊。
3、大家帮忙看看吧,难道WCF真的不能用Linq to SQL?
------解决方案--------------------http://www.cnblogs.com/wizardwu/archive/2009/08/09/1542102.html
------解决方案--------------------WCF使用 System.Runtime.Serialization.DataContractSerializer 进行序列化,Linq to SQL的实体不能被序列化传递到 WinForm或其他客户端是因为实体没有被标记为按DataContract(数据契约) 进行序列化。
除了手工对实体的代码进行[DataContract] 及 [DataMember] 标记外, 在Linq to SQL 设计器中将“序列化模式”设置为“单向”便可以对实体及其属性自动标记为[DataContract] 及 [DataMember]。
此外,在传输带有子表的实体时,由于 Linq to SQL 可以设置为延迟加载,如果子表还没有被加载(实例化),那么在序列化时是会出错的,这点要特别注意(自动生成的代码中对子表的 HasLoadedOrAssignedValues 进行了判断)。
最后,建议使用 EDM 代替 Linq to SQL,特别是升级到VS2010之后。
------解决方案--------------------在普通的代码中,我从来不用DataTable,我只用对象集合。这不是技术问题,而是策略性问题。
关于你的3,我觉得不要跟WCF该不该使用Linq to SQL纠缠在一起。使用DataTable是你搞的,不是WCF搞出来的。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------如果纯粹基于内存的数据库操作你可以使用LinqToXML,不必再使用DataSet这个老概念和方法了。
------解决方案--------------------
------解决方案--------------------看来是书本学的太多了,离实际愈来愈远了,这和分布式N层结构没有关系,实际上到了Linq阶段微软N层结构已经作废了。Web Service没有垮域限制,所以可以构造SOA,WebService是一个很好的结构,即低耦合结构,通过Web Service建立多个公用的服务,对于实现N层结构有很大好处。但是到了WCF,增加了跨域限制,实际上就完全否定了Web Service的初衷,我至今不明白微软为什么要增加跨域限制。如果你不建立一个可共享使用的服务,就没有必要建立Web Service结构,更何况WCF又有跨域限制,这就限制了共享服务的构建,只能在独立的域中使用,无法对第三方提供共享服务。Silverligh使用数据库不得不借助于WCF,仅此而已。使用WCF构造的服务端与使用Web Service构造的服务端有本质的不同,不同点就是跨域限制,无法实现分布式N层结构。
------解决方案--------------------
------解决方案--------------------在写代码是如果仔细观察一下,一个来连接符就能访问数据库,只要是TCP/IP,什么都隔离不了,internet也隔离不了,除非使用内网外网公用,服务端有自己的连接内网机制。
------解决方案--------------------你的观点我倒是第一次看到。 使用WPF和WinForm比Silverlight更容易调用WCF,WPF和WinForm本身就没有什么域的概念吧,都是运行在客户机的操作系统中的,不像Silverlight需要找一个IIS来host。
你的观点很新奇,可以和微软对WCF的介绍比较一下
http://msdn.microsoft.com/zh-cn/library/ms731082.aspx
------解决方案--------------------本来自己能够直接访问数据库,何必使用WCF,即使WPF由于它使用Winform也可以直接访问数据库。WinForm如果要使用WCF就必须有一个iis,这样在部署时会给用户带来很大的麻烦,本来在桌面上运行的应用程是不需要iis的,你非要给加一个iis,岂不是多此一举。没有什么“使用WPF和WinForm比Silverlight更容易调用WCF”问题,那只是个人的感觉,在代码运行意义不大。WPF和Winform实际上是有域概念的,它们在自己独立的域空间中运行。