UpdateAll

Jun 14, 2009 at 12:39 PM

I have used your DeleteAll method,great! (though should have linq support)

And do you have a plan that to add a UpdateAll method?

Coordinator
Jun 14, 2009 at 2:07 PM
This discussion has been copied to a work item. Click here to go to the work item and continue the discussion.
Coordinator
Jun 16, 2009 at 4:23 AM

There is a problem to implements this feature: how to use it ?

Like this:

var u = User.New().Init("tom", 18, true);
User.UpdateAll(p => p.Age > 30, u);

Or Like this:

User.UpdateAll(p => p.Age > 30, p => p.Name = "tom", p => p.Age = 18);

With the first solution, DbEntry don't know which column should be updated and it will update ALL columns of the object.

With the secend solution, it looks too ugly for me and only support linq so I don't like it.

sipo, What do you think about this ?

Jun 17, 2009 at 2:11 PM
Edited Jun 17, 2009 at 2:19 PM

firstly,I think ...

用中文了。。。

第一种方法,如果想知道更新哪些值就只能在内部和New的进行比较。在执行UpdateAll之后,内部自己New一个实例,然后比较每一个属性看看是否有变化。虽然这样相对麻烦些,但也只有如此了吧。

要么就定义一个Directory<string,object>或者KeyValuePair,KeyValueCollection什么的,把需要更新的值传进这个里面,然后UpdateAll的时候再从这里Parse...

第二种,如果用Linq的话就好多了,我个人认为在当前的大趋势下Linq已经成为未来的必备品。DBentry不必拘泥于2.0,大可以放手一搏,进军3.5。本来先进的技术就是来用的,总会普及的。当然,考虑兼容性的想法我很赞成,但是如果过度兼容,性能上就难以满足了。因此即便这个特性仅支持Linq我个人认为也是无可厚非的.

你觉得呢

Jun 17, 2009 at 2:18 PM
Edited Jun 17, 2009 at 2:24 PM

Newtonsoft.Json很有趣,他干脆停止了2.0的版本,释出一个稳定版,直接集成3.5.

不过ORM有其特点,有所不同,不能以偏概全,一概而论。

我有时候也在想如果DBENtry把这些Assembly全部集成在一个全面为3.5或4.0的优化的assembly里面将会是啥样呢。想必是相当大的工程吧。呵呵。

----

过两天我准备帮dbentry测测SQL server 2008,还有oracle 11g和9i啥的。

Coordinator
Jun 17, 2009 at 3:34 PM

你的第一种解决方案并没有解决问题,如果是内部New一个实例,比如Gender,New出的实例中缺省是false,如果确实想UpdateAll Gender = false,则无法实现。

第二种方案并不只是 Linq 的问题,而在于,即使使用 Linq 后,代码也还是非常难看。

而且,不论第一种还是第二种方案,都需要大量的代码只供 UpdateAll 使用,其它的地方完全用不到。投入产出比很小。

至于集成到只支持 3.5 的 Assembly 里,大体只需要删除一些代码就可以了,Assembly 可以小一点吧,暂时倒也没有什么特别的好处。

Jun 18, 2009 at 5:10 AM

嗯,对,如果New之后再传进去一个string[]存着要更新哪些列就好了。

----------------------------------------------------------------------------------------------------

是否可以借鉴SQLStatement,把UPDATE XXX SET后面的和WHERE前面的干脆写成SQLStatement的形式呢。

Jun 18, 2009 at 5:13 AM
Edited Jun 18, 2009 at 5:14 AM

或者在需要更新的列前面加一个属性,比如【UPDATE("asdf")】,有点像 依赖注入,

然后当更新的时候,UPDATEALL("asdf",n);

这样只更新那些属性为ASDF的列

Jun 18, 2009 at 6:06 AM

刚想实现 IDbObject的IOC 发现IDbObject没有声明DependenceEntry, IoC 不能用在表上,哎~

Jun 18, 2009 at 6:08 AM
Edited Jun 18, 2009 at 6:22 AM

dbentry.from<这里面能不能填经过IOC的IDBOBJECT呢>.WHERE(wc).SELECT

Coordinator
Jun 18, 2009 at 7:30 AM

搞成SQLStatement的样子,和直接使用SQL有多大区别了?

IoC确实不能用在表上,即使能用的话,你的哪个实际中的项目需要呢?

Jun 18, 2009 at 3:32 PM
Edited Jun 18, 2009 at 3:36 PM

其实没关系,有些不能用IOC的就 SWItch吧,毕竟IOC已经给我省了不少代码了

 

 

private int SwitchClass(WhereCondition wc,int index)

        {

            switch (cx.ClassName)

            {

                case "v_rkdt":

                    return BindSql<v_rkdt>(wc,index);

                default:

                    throw new Exception("Err");

            }

        }

 

然后BindSql里面是用

DbEntry.From<T>()。。。。GetCurrentPage得到一个ILIST,然后BIND给一个DataSource

还有老大的ObjectInfo.GetInstance

f.MemberInfo.HasAttribute和f.MemberInfo.GetAttribute真是超好用啊。感谢