Sharping's Technique Claver

Just be a low-level developer !

博客园 首页 新随笔 联系 订阅 管理
  12 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

我的评论

@Jeffrey Zhao

Insert是可以的,我的意思是想要Select可以就不能用InheritanceMapping,但是这样的话Insert又不行,两者总有一者出问题,我最后选择不用InheritanceMapping,也不用InsertOnSubmit方法,自己扩展个Insert方法。这样就能简单继承,查询时可以select new PurchaseOrderInfo,又可以直接Table<PurchaseOrder>.Insert(new PurchaseOrderInfo()),唉,都是因为之前RTM那个BUG没有了。
@Jeffrey Zhao

这只能用你的那个扩展查询了啊,实在没办法,我项目里是不用InsertOnSubmit了,自己搞个Insert扩展,没办法啊,多表继承跨不过去
re: 老调新弹,也玩Linq To Sql批操作 sharping 2008-05-09 23:41  
@Jeffrey Zhao

Expression Visitor有官方的?我看那个WEB SITE也就是一个BLOG啊?给我个网址,谢谢啦,赵哥
@mmkk

不仅仅是怕这个麻烦,这个可以写个属性
public string SupplierName
{
get{ return this.Supplier.SupplierName; }
}
关键是我不想得到多余的字段,主要是Translate方法对追踪对象无法赋值未映射属性,哪怕是ObjectTrackingEnabled = false, 很确定MSDN文档写错了,至少是不明确,同时RTM之前的"BUG"没有了,不能SELECT NEW 追踪对象,继承关系还是为了提交时候不去做数据转换,我实在不知道如何让LoadOptions不查询多余字段,除了两次查询,种种这些。。。我现在考虑不再用ls的InsertOnSubmit的了,他限制太多。
@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的示例去应用很简单,但仅以官方用法使用未免显得只是初窥门径了。
@mmkk

汗一个!你再仔细看看吧, Order表里没有SupplierName字段的也就是说Order实体里只有SupplierId,SupplierName是连接Supplier实体的Name属性得到的,我觉得图已经够清楚了,闹半天还是还是没看清楚呀。你不会是觉得做两个查询先查Order,在查Supplier同时返回两个实体更好吧?
@mmkk

是的,部分功能还需要WCF
@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意义就丧失了,或许我是理解偏颇吧,希望指教
@Jeffrey Zhao

where a.Type = "..." // Discriminator

数据库中没有Type列啊,上面会生成where type = ''的SQL语句,过不去。。。
re: Q & A专用文章 sharping 2008-05-06 11:24  
@Jeffrey Zhao


需求有点特殊,不知道是不是我的思路有问题,还望指教,这个问题在于实体继承,我希望一个子类继承于一个单表实体,但是这个子类可能是跨越多张表的查询结果,又有可能用子类直接进行插入操作,难道只能反射属性去在new一个基类?当然这个问题如果如果是在WCF的服务端,用KnownTypeAttribute处理完全没问题,因为序列化后实际产生了基类,但本地处理时候如果不用Linq的继承(InheritanceMapping)由于TableAttribute特性不会被子类继承,根本无法插入操作,但是用InheritanceMapping的话最让我郁闷的是她要提供一个鉴别器列(IsDiscriminator = true),我只能想到查询一个常量来得到这个鉴别其列,DataContext.Translate和MSDN上说的似乎也有出入,如果不使用InheritanceMapping而在子类上显式加上TableAttribute特性他会报错,所以我试了您的ExecuteQuery扩展方式处理也不能完成要求,MSDN上说只要是Context追踪的实体就可以了,难道是我理解错误?谢谢
re: Q & A专用文章 sharping 2008-05-06 00:02  
@Jeffrey Zhao

不好意思,没说清楚,我的意思就是Linq to Sql 里似乎无法得到这种形式的查询结果,
var query = from o in context.Orders select
new{Id = o.Id, SomeProp = "AAA"};
这样执行的Sql还是
select Id from [Order]
期望执行的SQL是
select Id, "AAA" from [Order]

SomeProp 属性是在映射时候才被赋值的,而不是在查询结果里就有,不知道有没有方法生成在查询结果里,ColumnAttribute的Expression属性貌似只支持计算表达式



re: Q & A专用文章 sharping 2008-05-05 22:53  
Linq 似乎不能写出 select "AAA", * from Order
只能动态执行T-Sql?
re: 宿主工作流设计器(三) sharping 2008-02-02 13:15  
@人称白目
不是很明白你说的不好用是什么意思,后面我会介绍另一种方法实现菜单
re: 我眼中的Ajax sharping 2008-01-25 09:45  
@怪怪(未登录)

我觉得我们看的观点有些异样,实现上的设计那是另一个层面的东西,做什么程序都需要设计吧,那不单单是技术的学习,还需要经验的积累,就好比说23种设计模式你全学会了也没有,照旧写糟糕的代码,我从一开始并没有打算讨论这些。还有“JS提供的特性要比C#/Java之类单纯的多, 要说繁杂恐怕也说不上吧... ”我并不觉得JS会比C#简单,它是过程化的,虽然带入一些面向对象特性,但总是比面向对象语言要复杂,从代码重用性就能看出,还有JS语法上的杂乱我觉得复杂性也不小。可能是我的JS功力太低吧...
re: 我眼中的Ajax sharping 2008-01-25 09:39  
@Jeffrey Zhao

哎,刚开始入门,只看了一些原理上的资料,实际实现接触的很少,因为一直做的是WinForm开发,所以可能有的理解是错误的,您的网络广播课程我也正在下,还没开始看,我发现微软的UpdaterPanel并没有用json也不是XML啊,是不是微软的格式又是自己的标准?其他框架我也没研究到底是Xml多还是json多。
re: 宿主工作流设计器(一) sharping 2008-01-22 09:01  
@巫云

在网上有一个老外写的Web版实现,记不清在哪里了,我想用WebPart应该可以实现吧
re: C#实现PDA电源/背光管理 sharping 2006-12-22 00:17  
yes , the EventModify method is include in "coredll.dll", you can see the SDK document to find the particular information to p/invoke
re: 控制PDA的背光和电源 sharping 2006-10-19 00:23  
不是吧, 转型Web开发~~汗,似乎.NET就只剩下ASP.NET了, 都跑去做Web了, 又少了个战友,5555~~~