re: C#实现PDA电源/背光管理 friend 2008-07-22 15:25
十分感谢
--引用--------------------------------------------------
锦瑟无端五十弦: 主要是.net程序员都懒惯了,指望着微软能把所有事情都解决掉。如果代码中一会写linq,一会调存储过程,代码也不好维护,结构也难看,呵呵.
--------------------------------------------------------
直接用SQL语句也可以啊~~~虽然感觉起来有点不完美,但任何框架都不能做到完美的,LINQ TO SQL支持SQL语句和存储过程就是这个原因~~~
楼主这个显然也不是最完美的解决方案,不过用来学习一下构造linq的表达式倒是一个不错的例子
re: 老调新弹,也玩Linq To Sql批操作 锦瑟无端五十弦 2008-05-19 17:02
主要是.net程序员都懒惯了,指望着微软能把所有事情都解决掉。如果代码中一会写linq,一会调存储过程,代码也不好维护,结构也难看,呵呵.
恩,不错!批处理在linq to sql中实现还是比较麻烦的
re: 老调新弹,也玩Linq To Sql批操作 playboy1 2008-05-12 12:47
能不能,提供一下整理后的代码,这样大家都可以节约一些时间,谢谢!
re: 老调新弹,也玩Linq To Sql批操作 Jeffrey Zhao 2008-05-11 01:46
@锦瑟无端五十弦
批更新本就不是ORM所长,和LINQ to SQL无关。你见过哪个ORM框架实现了这些?
re: 老调新弹,也玩Linq To Sql批操作 锦瑟无端五十弦 2008-05-11 00:52
一个这么简单的批操作竟然都不支持,在官方更新linq之前还是用存储过程好了……
@Jeffrey Zhao
Insert是可以的,我的意思是想要Select可以就不能用InheritanceMapping,但是这样的话Insert又不行,两者总有一者出问题,我最后选择不用InheritanceMapping,也不用InsertOnSubmit方法,自己扩展个Insert方法。这样就能简单继承,查询时可以select new PurchaseOrderInfo,又可以直接Table<PurchaseOrder>.Insert(new PurchaseOrderInfo()),唉,都是因为之前RTM那个BUG没有了。
re: Linq To Sql, 为何继承就这么费劲? Jeffrey Zhao 2008-05-10 17:55
@sharping
不光insert不行了,普通select也不行了,呵呵。
re: 老调新弹,也玩Linq To Sql批操作 Jeffrey Zhao 2008-05-10 17:54
@sharping
在MSDN里查找开发自定义LINQ Provider就会看到这个类了。
re: 老调新弹,也玩Linq To Sql批操作 Jeffrey Zhao 2008-05-10 17:54
@Juzz Pig(橘子&猪)
后来有人搞过了,所以没下文了。其实这篇也不错啊。
re: 老调新弹,也玩Linq To Sql批操作 Juzz Pig(橘子&猪) 2008-05-10 10:17
记得老赵上次也说过要搞这玩意,现在情况怎么样了?
@Jeffrey Zhao
这只能用你的那个扩展查询了啊,实在没办法,我项目里是不用InsertOnSubmit了,自己搞个Insert扩展,没办法啊,多表继承跨不过去
re: 老调新弹,也玩Linq To Sql批操作 sharping 2008-05-09 23:41
@Jeffrey Zhao
Expression Visitor有官方的?我看那个WEB SITE也就是一个BLOG啊?给我个网址,谢谢啦,赵哥
re: Linq To Sql, 为何继承就这么费劲? Jeffrey Zhao 2008-05-09 21:22
[Column(Storage="_SupplierName", IsDbGenerated = true, AutoSync = AutoSync.Never)]
不过加了这个的话普通的Select就有问题了,因为不存在SupplierName这个字段。
re: 老调新弹,也玩Linq To Sql批操作 Jeffrey Zhao 2008-05-09 21:11
不错不错,很好玩,我没有想过够造成这样的,呵呵。还有Expression Visitor是MSDN提供的,基本上解析Expression必用了。
@mmkk
不仅仅是怕这个麻烦,这个可以写个属性
public string SupplierName
{
get{ return this.Supplier.SupplierName; }
}
关键是我不想得到多余的字段,主要是Translate方法对追踪对象无法赋值未映射属性,哪怕是ObjectTrackingEnabled = false, 很确定MSDN文档写错了,至少是不明确,同时RTM之前的"BUG"没有了,不能SELECT NEW 追踪对象,继承关系还是为了提交时候不去做数据转换,我实在不知道如何让LoadOptions不查询多余字段,除了两次查询,种种这些。。。我现在考虑不再用ls的InsertOnSubmit的了,他限制太多。
非注册用户不能编辑真实麻烦, 不好意思只好再次留一次言了, 有Nested object的Custom object绑定到Winform的Grid的确是比较麻烦, 不过Google一下还是找到很多文章的. 楼主是为了避免这个麻烦才选择使用继承关系的吧, 不然如果改用聚合关系就可以在LS这端省却很多的麻烦. 至少projection的时候不用再这么麻烦了.
有探讨才有进步吗, 只是语言可能表达不太适当而已, 呵呵.
我想我是明白了, 我一开始局限于Asp.Net的Web场景, 而你的场景是WCF的远程调用 + Winform作为client端, 所有才有这么多的误解, 以至于连Order.Supplier.SupplierName这种绑定方式都要争论, 这个在Asp.net当中当然没有问题. 返回IQueryable<Order> + LoadOptions是最简单的做法, 不过的确并不是适用于远程调用的场景, IList<T>才是远程方法返回值的最佳选择. 其实我上面也提出了使用Custom Entity + Linq to SQL的做法, 而完全不使用LINQ to SQL自动产生的Entity, 这种做法我做了一些简单的测试(CRUD), 有一定的可行性, 它避开了一些LINQ to SQL的局限性(例如只对部分属性赋值, 序列化问题, 还有stateless情景下的更新问题), 但是同时也限制了一些应用, 譬如Association的一些应用等等.
@mmkk
顺便说句,不讨论这个问题了,快成我们的辩论会了,我知道这个办法有的地方显得过于繁杂,但是实出无奈之举,我找不到更好的办法突破ls的单表继承,哪位大侠帮忙解决这个问题小弟感激万分
@mmkk
------------------------------------------------------------
到底是我没有明白还是你没有明白啊, 我晕...SupplierName是来自Supplier这个大家都明白, 通过Order.Supplier.SupplierName就可以访问到了, 我就不明白为什么不能通过返回List<Order>来取得, 通过LoadOptions就可以做到了.
------------------------------------------------------------
LoadOptions是指lazy load吗?不是每条Order记录要两次查询?不lazy load你不是太多多余字段一起查出来了?我觉得你没理解这个问题的应用场景,实际应用中可能不但有Order.Supplier,可能还有Order.Customer,还有Order.Employee等等,你全部用LoadOptions?那要么查询次数加剧,要么多余字段增多,不巧的是这些他们可能都只需要一个Name字段显示一下名称,再者使用Order.Supplier.SupplierName怎么绑定Grid数据行呢?再写个属性封装一下?如果这是在一个WCF客户端或者ASP.NET中呢?每个Order挂都挂着一个装载了Supplier实体对象的属性,传输量不是成倍增长?我说了取得List<OrderInfo>就要马上显示SupplierName,lazy load显然是不行的。总之出于性能考虑才有了这种解决办法,否则反射就可以实现,另外据我使用下来看LoadOptions也还有颇多问题,有空我会写出来,LS照着MSDN的示例去应用很简单,但仅以官方用法使用未免显得只是初窥门径了。
到底是我没有明白还是你没有明白啊, 我晕...SupplierName是来自Supplier这个大家都明白, 通过Order.Supplier.SupplierName就可以访问到了, 我就不明白为什么不能通过返回List<Order>来取得, 通过LoadOptions就可以做到了.
@mmkk
汗一个!你再仔细看看吧, Order表里没有SupplierName字段的也就是说Order实体里只有SupplierId,SupplierName是连接Supplier实体的Name属性得到的,我觉得图已经够清楚了,闹半天还是还是没看清楚呀。你不会是觉得做两个查询先查Order,在查Supplier同时返回两个实体更好吧?
那我更不明白了为什么不直接返回Order呢???你觉得返回Order的问题是什么呢?要显示SupplierName完全没有问题
@mmkk
补充一下:
楼主的情况是否仅仅因为Grid的信息实在没有必要加载Order以及Supplier的全部信息, 而匿名类又无法穿越Assembly来引用?
这种问题不存在的,仅仅需要OrderInfo的话我只要不做任何处理,让他简单的继承Order以后在Linq代码里select new OrderInfo就可以了,没必要装箱,关键还是更新,比如说我需要在控件上显示一下SupplierName,同时我又希望把Order的某个字段(比如Number,单号)字段绑定到一个TextBox.Text,这样我就会从控件修改这个OrderInfo(注意:为了显示SupplierName我不能只查询Order)提交时候我想直接提交这个OrderInfo,我实在没有其他更好的思路.
@mmkk
关键在于OrderInfo修改后不能用LS更新回去,或者说new 一个OrderInfo以后用LS无法Insert到数据库
@J. Lin
1.查询时还是要用join,为什么不用view。谁说view无法提交修改?有PK就能提交修改。
如你后面所说,可更新视图至少在SQL SERVER 2005中是需要使用INSTEAD OF触发器的,而不是有主键就行,我可能对一个Order表有多种不同的视图,这样在Sql Server里维护视图必将是件头疼的事,我更乐于在代码里完成,很大原因是代码里是强类型,不容易出错,我所说的不能提交修改是排除了使用INSTEAD OF触发器情况,是我没说清楚。
2.insert时其实还是insert order,为什么不直接new order。
这正是我全文所要解决的问题,我查询的得到的是List<OrderInfo>列表我希望我在修改了这个列表的数据时候能直接将它们提交回去,而不是对每个OrderInfo再次创建属性相等的Order对象再提交,反射一下可以做到这点,但是这样一条记录尚可,记录很多的批量更新性能损失不可避免。
封装在C#: 自建business entity,linq to sql 只是作为data access填充,MS有不少这样的实例程序。
这句话我没理解清楚,回到传统ADO.NET里去?那样我觉得ORM意义就丧失了,或许我是理解偏颇吧,希望指教
LS的继承一般应该是针对同表有字段区别的情况, 楼主的情况是否仅仅因为Grid的信息实在没有必要加载Order以及Supplier的全部信息, 而匿名类又无法穿越Assembly来引用, (实际上如果你愿意使用Object[]来返回匿名类的话直接绑定到Grid上面是没有问题的, 但这样的设计实在没有什么道理)? 这种情况返回IQueryable<Order>是比较可选的好处, 兼顾效率以及强类型的好处, 但也有一些缺点不小心的话可能也会引起性能问题, 尤其是表连接很多的情况下. 这样的话你还需要担心更新的问题吗? 所有的更新最终还是要反映到Order和Supplier中去, 有这两个Entity应该是够了. J.Lin说的另外两种方案, 对于第一种, Dinner Now就是这样做的, 但是小型应用可以, 如果表多一点, 你要维护两份的Entity, 我在一个小型项目中应用过, 但还是觉得麻烦, 尤其很多时候你会面临选择, 譬如新增的时候你是用你自己定义的Entity呢还是用LS的Entity, 如果用你自己的Entity, 那么Insert的时候又要转换, 这又会有很多的问题, 因为你不知道用户到底对哪些字段赋值了. 而返回列表的时候有自定义的Entity就方便了, 最终的情况是到LS的Entity和你自己的Entity之间切来切去, 超级麻烦.
我想还是自定义Entity, 但不要LS自动生成的那些Classes, 同时又能部分使用LS的一些功能应该会是一个比较理想的情况.
博主精神可佳。不过这样写看上去有点怪
1.查询时还是要用join,为什么不用view。谁说view无法提交修改?有PK就能提交修改。
2.insert时其实还是insert order,为什么不直接new order。
linq to sql的继承确实不太好,我见过的解决方案主要有:
1.封装在C#: 自建business entity,linq to sql 只是作为data access填充,MS有不少这样的实例程序。
2.封装在sql server: 用view整合多表继承,给view设置instead trigger完成对应表的插入和修改,MS Office Accounting就是这么干的。
当然工作量肯定要增加的,仅供参考。
re: Linq To Sql, 为何继承就这么费劲? 金色海洋(jyk) 2008-05-07 19:18
自己写的东东才是好东东。
借用怪怪的话:之所以好,是因为知道他的缺陷,而且知道如何绕过去。
re: Linq To Sql, 为何继承就这么费劲? Jeffrey Zhao 2008-05-07 19:00
@老Q
linq绝对是好东西,linq to sql可能有限制这个限制那个。
re: Linq To Sql, 为何继承就这么费劲? Jeffrey Zhao 2008-05-07 19:00
@Gray Zhang
Change Track有没有用是业务决定的,对于企业应用来说,Change Track几乎是必备的。
re: Linq To Sql, 为何继承就这么费劲? Gray Zhang 2008-05-07 16:14
linq 2 sql实在不好用,所以最近的项目也考虑回到ADO去
Entity Framework试用过,感觉也不怎么样,主要原因是侵入性太强
个人是希望实体类就不要有任何负担,只管保存自己的状态的,然而EF默认实体类继承自EntityObject,导致我无法再使用继承,使用别的方法绕过了这个问题,又觉得所谓的Change Track其实也不见得有用,特别是和WCF在一起工作...
--引用--------------------------------------------------
老Q: 从来没有看好过linq。。。。
微软的东西还是等第二版,第三版出了在用吧
--------------------------------------------------------
linq是我最看好的ms作的东西。至于第二版第三版之说,其实也不要太在意,尽管linq2sql目前的态势是丑陋了一点,以后会好的,何况如果只是做一些简单的操作,不过度的依赖,它是最快捷的语言和工具。
除了sql其实还有object和xml。
从来没有看好过linq。。。。
微软的东西还是等第二版,第三版出了在用吧
@Jeffrey Zhao
where a.Type = "..." // Discriminator
数据库中没有Type列啊,上面会生成where type = ''的SQL语句,过不去。。。
re: Linq To Sql, 为何继承就这么费劲? Jeffrey Zhao 2008-05-07 13:47
哥们抬举了,LINQ to SQL很……可以当智力题玩。
我觉得某些时候你的问题可能可以这样:
from a in db.As
where a.Type = "..." // Discriminator
select
new
{
SomeProp = a.SomeProp
Type = a.Type
}
re: 宿主工作流设计器(一) JOC 2008-04-22 11:25
現正在WF研究中,希望能與樓主流
QQ:4401646
re: 宿主工作流设计器(一) feishu 2008-04-03 13:46
这个流程设计器那里有的下载呀!
QQ:78815730
re: 宿主工作流设计器(三) 人称白目 2008-02-04 09:06
@sharping
意思就是选中控件之后 Ctrl+C调用MenuCommandService的Copy
然后 Ctrl+V调用MenuCommandService的Paste
但是什么效果都没有,就好像什么都没发生一样
re: 宿主工作流设计器(三) sharping 2008-02-02 13:15
@人称白目
不是很明白你说的不好用是什么意思,后面我会介绍另一种方法实现菜单
re: 宿主工作流设计器(三) 人称白目 2008-02-01 14:40
小弟最近也在想做一个宿主设计器,在使用MenuCommandService时遇到了其中Copy,Cut,Paste这3个功能不好用,而Delete却好用,原因百思不得其解,望指点一二,不胜感激。
re: 宿主工作流设计器(三) C_stone 2008-01-31 15:12
非常感谢搂主的分享,最近也正在做这方面的调研,希望能尽快看到后续的章节。谢谢。
re: 我眼中的Ajax 破曉之陽 2008-01-25 17:50
路過。
re: 我眼中的Ajax 早班火车~ 2008-01-25 14:11
ajax有好有坏,要具体问题具体分析。
比如有时页面无刷新反倒给用户造成错觉以为点击页面没有变化。
pv也是个很重要的因素。
所谓鱼于熊掌不能兼得。