不使用反射的实体类,大家评评?
看过很多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
[解决办法]
[解决办法]
当你把一切都离散化之后,那么跟反射的编程机制其实也是一样的。
[解决办法]
wa !不错不错诶!
[解决办法]
有实力 羡慕啊
[解决办法]
不错 学习了
[解决办法]
学习中
[解决办法]
jf
[解决办法]
jf
[解决办法]
接分
[解决办法]