最近做项目使用linq,发现它有些非常恶心的缺陷,也许它有解决办法,反正我在网上查不到解决方案,请高手帮忙看看能不能解决。
恶心点1:随意命名外键关系
一个表有两个外键,两个外键都指向同一个表,于是,该表生成的类具有两个外键对象,好了,linq开始了它非常恶心的命名,直接就是一个命名为“外键表名”,一个命名为“外键表名1”,调用的时候由于没有注释,我根本不知道哪个对应哪个外键。
当然,这个可以自己配置命名,但会带来更恶心的问题,由于linq没有同步数据库表的选项,当数据库表更改后,我不得不全部重新拖一遍,又不得不重新一个个去命名,极其恶心。
恶心点2:读取外键属性时不能实行延迟转换sql语句。
如一个表A有一个外键,当然它会生成一个外键对象B,当我得到一个A对象后,我想计算对象A中包含多少个对象B,最简单的方式就是A.B.Count,但令我想不到的是,居然linq生成的语句不是Count,而是将全部B都读进了内存。于是我又换用A.B.Count(),问题依旧,效率极低。
当然还有无注释的问题,虽然可以自己添加,一变动表结构重新拖一次全部消失。
不会用LINQ而已,以前我也是这样,现在才知道我以前多么无知。
做法很简单,你不应该重新拖,而是在类上设置映射关系,这很简单的。
如果你要写注释,建议写在分布类里,写在desinger.cs里只能说明你自己不看代码生成文件的注释,是自己傻
你这是发表博文还是提问题啊?
问题,求解决办法
你用的方式不对吧。
延迟加载和linq没有直接的关系吧。你是用EF吧。
你说的都不是LINQ的问题
A.B.Count()
这个好象是这样的,会全读。不过,对于IQueryable执行count()是会转为select count(*) from...的。
----
一个表有两个外键,两个外键都指向同一个表,于是,该表生成的类具有两个外键对象,好了,linq开始了它非常恶心的命名,直接就是一个命名为“外键表名”,一个命名为“外键表名1”,调用的时候由于没有注释,我根本不知道哪个对应哪个外键
===================
这个好象是子表的名字吧,子表名字不会相同,可以区分啊。如果是同一个表指向外键指向自已,则叫作比如Menu1,Menu2 一个代表父,一个代表子。确实有你说的问题 。
当然还有无注释的问题,虽然可以自己添加,一变动表结构重新拖一次全部消失。
==============
注释可以写在后面的分部类的cs文件中。刚好在分部类中作一些初始化工作,也不觉不可。不是那个designer.cs中