欢迎大家都来讨论一下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搞出来的。
[解决办法]
我们学东西要学本质,不要学形式,不管在什么条件和场合下都使用WCF,如果你知道WCF的本质你就知道为什么在桌面程序不必使用WCF了。
[解决办法]
无语了。 我只知道越来越多的桌面应用程序会使用Internet上的WCF服务,在本机并不需要一个host,更不需要IIS,服务嘛,本来就是放在Internet上的,呵呵。
“使用WPF和WinForm比Silverlight更容易调用WCF” 是指 Silverlight 只是支持部分的WCF配置,WS-、二进制传输等等都不支持,限制了WCF的能力~~
再说下去就没有意义了啦,偏离楼主太远了
[解决办法]
DataContext db = new DataContext (); //具体请使用你自己的 DataContext 实现的对象。
DataTable dt=new DataTable();
var query = from u in db.Users where u.RoleID ==3 select u; //得到 IQueryable 对象
//这样调用
dt= query.ToDataTable(db);
linq to sql 转换成 datatable
[解决办法]
不明白 这段 【 WCF一端,如何在Linq to SQL查询到数据后,将查询结果序列化并返回给WinForm?】
我现在也是在做类似的项目,不过是 framework entity + remoting,客户端也是winform,和你的基本是一样的模式,无论是remoting还是wcf都可以把查询后的对象集合直接返回到winform啊。
顺便说一下为什么在winform下用remoting,来解释楼上有个仁兄说的 wcf+winform是个很荒唐的做法
,我做的项目是工厂的生产系统,业务数据量比较大,图形界面也比较多,所以b/s不适合,同时我们的数据库是oracle,另外我们系统还要调用某外国业务平台的com+,如果不走remoting的话,winform客户端需要安装oracle客户端,这个平台的客户端,而通过remoting的话,只需在remoting 服务器上安装这些东西,winform客户端什么都不需要就可以调用了。
[解决办法]