不使用反射的实体类,大家评评?

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

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,查询:

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,呵呵。

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

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

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





...全文
5015 193 打赏 收藏 举报
写回复
193 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Jake5s 2012-10-06
支持 感谢
  • 打赏
  • 举报
回复
bluedoctor 2011-10-05
[Quote=引用 190 楼 r_zhanche 的回复:]
思想很不错,但是 咋一看 代码命名不规范
类似

C# code
System.DateTime
的直接写出

C# code
DateTime
就可以了
[/Quote]
这是为了使用CLT通用类型,方便C#和VB都可以使用。
  • 打赏
  • 举报
回复
R_zhanche 2011-09-30
思想很不错,但是 咋一看 代码命名不规范
类似
System.DateTime
的直接写出
DateTime
就可以了
  • 打赏
  • 举报
回复
bluedoctor 2011-04-08
[Quote=引用 188 楼 oriesmap 的回复:]
广告贴,鉴定完毕。
什么蓝博士,什么PDF.net框架。
[/Quote]
非赢利性质的还是广告贴?
没有用过不要在这里妄自菲薄。
  • 打赏
  • 举报
回复
OriesMap 2011-04-01
广告贴,鉴定完毕。
什么蓝博士,什么PDF.net框架。
  • 打赏
  • 举报
回复
bluedoctor 2011-02-21
[Quote=引用 186 楼 itinfm 的回复:]
我算是看清楚了,关键点在这里,楼主说实体类内部已经有属性名称列表了,那这属性名称列表如何生成,用手工的方式一个一个属性加进去???反射就是为了减少我们的手工劳动量而降低了性能,而你为了性能而增加了我们的手工劳动量,你把计算机要做的事情转嫁到人的身上了!倒退啊!!!
[/Quote]
大部分Orm框架都必须依赖于Orm工具的,就算现在的Entity Framework,如果没有VS支持,不是一样把人累死吗?
PDF.NET 数据开发框架提供一套工具自动生成实体类。
  • 打赏
  • 举报
回复
itinfm 2011-02-18
我算是看清楚了,关键点在这里,楼主说实体类内部已经有属性名称列表了,那这属性名称列表如何生成,用手工的方式一个一个属性加进去???反射就是为了减少我们的手工劳动量而降低了性能,而你为了性能而增加了我们的手工劳动量,你把计算机要做的事情转嫁到人的身上了!倒退啊!!!
  • 打赏
  • 举报
回复
wufanglu 2010-05-15
[Quote=引用 110 楼 qldsrx 的回复:]

引用 85 楼 bluedoctor 的回复:
引用 78 楼 flying_net 的回复:
如果Sql语句是:
C# codeSelect A.*,B.*from A,B Where A.ID= B.ID 呢?


目前暂时不支持,如果扩展OQL是有可能支持的。现在的解决方案是这些复杂的SQL语句交给SQL-MAP去做。

你所谓的SQL-MAP是什么东西,能介绍下吗?我现在用的最多的还是多表联合查询,获取的结果集是无法事先从数据库中得到架构的,必须通过 SQL语句在运行时获取表架构,而且就算有工具支持通过SQL语句来自动创建实体类,但是如果无法做到运行时创建也是没有意义的,因为我需要运行时随时可以自定义SQL语句,要求的功能更强大才行,显然只有DataTable才能做到,实体类根本无法实现这种要求。
总之,喜欢实体类的人就是喜欢偷懒的人。[/Quote]

做超小项目的人可以用实体类,做超大型项目的人可以选择实体类,
但对于我们要处理复杂多变的非大非小项目,,只能默许DataTable。

另,喜欢用实体类的人,,“敲点爽”哇!!
强烈建议 DataTable语法支持简写,如:
dataRowCustomer["Name"] = txtName.Text; => dataRowCustomer!Name = txtName.Text;
  • 打赏
  • 举报
回复
amh1979 2010-05-13
不错的东东
  • 打赏
  • 举报
回复
bluedoctor 2010-02-13
除夕,天快黑了,结贴,送分,点炮!
  • 打赏
  • 举报
回复
bluedoctor 2010-02-11
看来大家都回家了阿,祝大家旅途愉快了!
  • 打赏
  • 举报
回复
bluedoctor 2010-02-07
给坛子里的朋友拜年了!
框架最新版本V3.0 发布了,需要的朋友请下载
  • 打赏
  • 举报
回复
jeff_0000 2010-01-29
好的,谢谢
  • 打赏
  • 举报
回复
bluedoctor 2010-01-29
[Quote=引用 167 楼 fenghuo12 的回复:]
49楼
回复于:2010-01-26 13:29:361、楼主的方法跟用反射没什么区别;
1、如果不能把字段再次抽象出采用数据无关的方案,到目前为止,数据集还是最好的方法,数据本来就是弱类型的,微软已经给出近乎最好的解决方案了;
2、数据是项目中最不稳定的因素,大多数项目修改是由于数据结构的修改导致的,一种方法是采用去类型化的方法“抵抗变化”;另一种方法对数据结构进行抽象,类似表设计器的样子,你可以用一个表设计器设计出千变万化的数据结构,
您的这种说法很好,有没有对于2的解决方案的应用,实例什么,谢谢
[/Quote]

实体类就是对业务数据的抽象,它跟数据库表是没有直接关系的,仅仅是一个映射和抽象。例如,你修改了数据库的字段名称,在实体类里面修改一下属性对应的字段名称即可,属性名称不用修改。通用,你可以把一个数据库表的一部分抽象成一个实体类,甚至是多个表的查询(通过SQL-MAP)或者视图映射到实体类。总之,PDF.NET允许你以各种方式对数据库进行抽象,映射成你需要的实体类,从而脱离对具体数据库和数据库改动的影响。
  • 打赏
  • 举报
回复
flyskytoday 2010-01-29
学习学习。。。
  • 打赏
  • 举报
回复
缪军 2010-01-29
[Quote=引用 95 楼 bluedoctor 的回复:]
……
[/Quote]

1、很高兴楼主提到你们的方案是跟你们的生产手段相适应的,这很好;
2、按照你们现在的由数据库驱动项目开发的生产方式,数据结构发生变化后很可能会导致你们的项目在N处的修改,只不过你们可以用工具自动替换需要更新的代码,但是项目需要重新发布,如果不同的客户需要不同的字段,那你们要不不停的发布项目,要不就发布n多不同的版本,当然也可以选择不理会客户提出的需求变更。

  • 打赏
  • 举报
回复
spring20130808 2010-01-29
UP
  • 打赏
  • 举报
回复
saviorzuo 2010-01-29
mark
  • 打赏
  • 举报
回复
Greentea107 2010-01-29
虽然看不明白,但还是要顶
  • 打赏
  • 举报
回复
zardo 2010-01-29
学习!!
  • 打赏
  • 举报
回复
加载更多回复(159)
相关推荐
发帖
C#

10.8w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
帖子事件
创建了帖子
2010-01-25 06:23
社区公告

让您成为最强悍的C#开发者