首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

不使用反射的实体类,大家评评?解决思路

2012-01-15 
不使用反射的实体类,大家评评?看过很多ORM的实体类方案,大多是用反射来读数据库数据,这样当频繁操作实体类

不使用反射的实体类,大家评评?
看过很多ORM的实体类方案,大多是用反射来读数据库数据,这样当频繁操作实体类的时候效率很低,我借鉴了一位朋友的思路,采用.NET 2.0的泛型技术,为实体类提供一个通用的查询和持久化方案。
先看看实体类定义:
 

C# code
using PWMIS.SqlMapper.Entity;namespace PLZDModel{    public class PFT_Report : Entity    {        public PFT_Report()        {            TableName = "PFT_Report";            //IdentityName = "标识列";//如果指定了标识列,可以处理自增列插入问题            //PrimaryKeys.Add("主键列");//指定主键列方可以删除和更新实体数据            AddProperty("ID", default(System.Int32));            AddProperty("FinancialPlanersNo", default(System.String));            AddProperty("FundAccount", default(System.String));            AddProperty("CityCode", default(System.String));            AddProperty("BankCode", default(System.String));            AddProperty("NetWork", default(System.String));            AddProperty("ApplyTime", default(System.DateTime));            AddProperty("FileName", default(System.String));            AddProperty("GenerateTime", default(System.DateTime));        }        public System.Int32 ID        {            get { return (System.Int32)getProperty("ID"); }            set { setProperty("ID", value); }        }        public System.String FinancialPlanersNo        {            get { return (System.String)getProperty("FinancialPlanersNo"); }            set { setProperty("FinancialPlanersNo", value); }        }        public System.String FundAccount        {            get { return (System.String)getProperty("FundAccount"); }            set { setProperty("FundAccount", value); }        }        public System.String CityCode        {            get { return (System.String)getProperty("CityCode"); }            set { setProperty("CityCode", value); }        }        public System.String BankCode        {            get { return (System.String)getProperty("BankCode"); }            set { setProperty("BankCode", value); }        }        public System.String NetWork        {            get { return (System.String)getProperty("NetWork"); }            set { setProperty("NetWork", value); }        }        public System.DateTime ApplyTime        {            get { return (System.DateTime)getProperty("ApplyTime"); }            set { setProperty("ApplyTime", value); }        }        public System.String FileName        {            get { return (System.String)getProperty("FileName"); }            set { setProperty("FileName", value); }        }        public System.DateTime GenerateTime        {            get { return (System.DateTime)getProperty("GenerateTime"); }            set { setProperty("GenerateTime", value); }        }    }}


之后,便可以这样使用实体类:
1,查询:
C# code
class Program    {        static void Main(string[] args)        {            PFT_Report utlReport = new PFT_Report();            OQL oqlQuerry = new OQL(utlReport);            utlReport.FundAccount = "1234234242423";            oqlQuerry.TopCount = 3;                        oqlQuerry.Select(utlReport.ApplyTime , utlReport.BankCode,utlReport.FileName ,utlReport.FundAccount )                .Where(utlReport.FundAccount)                .OrderBy(utlReport.GenerateTime, "desc");            Console.WriteLine ("SQL="+oqlQuerry.ToString ());            Console.Read();        }

运行程序将输出:
SQL=SELECT Top 3 ApplyTime,BankCode,FileName,FundAccount
 FROM PFT_Report
  Where FundAccount=@FundAccount
  Order by FundAccount desc



------------
使用该方式,可以选取实体类指定的字段,而不是一次选取全部字段。这对于一个拥有大字段的表来说很有用。字段的选取都是通过实体类对象.属性 的方式,完全面向对象,用起来有点像LINQ,呵呵。

保存数据也很简单,为指定的属性设置新值即可:

C# code
PFT_Report utlReport = new PFT_Report();            utlReport.FundAccount = "1234234242423";           EntityQuery<PFT_Report>.Save(utlReport);


你本次更新了多少个字段,框架只会生成要更新的字段的SQL语句,保证了数据更新的效率。

框架的详细内容请看:http://blog.csdn.net/bluedoctor/archive/2010/01/24/5251913.aspx

整个框架可以完全不使用反射来处理数据,大家评一下这样的方案好不好呢?







[解决办法]
不错,支持原创
[解决办法]
JF
[解决办法]
这个和LINQ TO SQL感觉上是一样的,不过不使用DataTable的话,有两个问题不知道你解决了没有:
第一个是动态产生实体类的问题,DataTable可以根据查询语句动态产生列,更新语句也可以自定义,但是LINQ TO SQL显然不行,你这个可以做到吗?
第二个是序列化问题,DataTable可以直接在WCF中传输,你这个实体类可以直接在WCF中传输吗?

如果上述两个问题不能解决,我还是倾向于使用DataTable,那点性能上的损失感觉不到什么的,关键还是要功能强大才行。
[解决办法]
不错 学习了
[解决办法]

[解决办法]
OQL是有一套完整的标准,楼主可以参考一下。

支持一下。
[解决办法]
很不错的思想,学习了。
[解决办法]
学习了
[解决办法]
不错学习.
[解决办法]
思想挺不错的。。回帖在仔细看。
[解决办法]
学习学习~
[解决办法]
顶一个lz
[解决办法]
探讨

用牛顿的话说,是站在巨人的肩膀上!
我的框架大部分思想都是跟流行的大框架类似的,但不是抄袭,而是借鉴其思想。说实话,到现在我都没有实际使用过Hibernate,而iBaties也是做了半个月都放弃了,感觉太复杂,至于LINQ,都后来才发现有这么一个东西,但人家是MS的,在编译器里面都集成了,所以看到LINQ出来以后,我曾一度准备放弃我的这套框架。但是去年,我们公司的一个产品采用Entity Framework的失败,才使我认识到,先进的不一定是合时的,于是在去年底,我把我的这套框架成功推行到公司的一个新项目中,目前进展非常顺利!


[解决办法]
当你把一切都离散化之后,那么跟反射的编程机制其实也是一样的。
[解决办法]
wa !不错不错诶!
[解决办法]
有实力 羡慕啊
[解决办法]
不错 学习了
[解决办法]
学习中
[解决办法]
jf
[解决办法]
jf
[解决办法]
接分
[解决办法]
探讨
引用:
是你自己原创吗?

用牛顿的话说,是站在巨人的肩膀上!
我的框架大部分思想都是跟流行的大框架类似的,但不是抄袭,而是借鉴其思想。说实话,到现在我都没有实际使用过Hibernate,而iBaties也是做了半个月都放弃了,感觉太复杂,至于LINQ,都后来才发现有这么一个东西,但人家是MS的,在编译器里面都集成了,所以看到LINQ出来以后,我曾一度准备放弃我的这套框架。但是去年,我们公司的一个产品采用Entity Framework的失败,才使我认识到,先进的不一定是合时的,于是在去年底,我把我的这套框架成功推行到公司的一个新项目中,目前进展非常顺利!



热点排行