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

My OQL:小弟我对ORM对象查询语言的一点思考

2012-02-26 
My OQL:我对ORM对象查询语言的一点思考最近一直在思考有关ORM的问题,对于对象查询的语法表达觉得很是头疼。

My OQL:我对ORM对象查询语言的一点思考
最近一直在思考有关ORM的问题,对于对象查询的语法表达觉得很是头疼。现在提出这样的对象查询语法表达式(以已经实现了),大家看看怎么样?

lbMsg.Text=dwfs
.Select   (new   object[]   {wfs.ID,wfs.Name}   )
.Where   (new   Condition(dwfs).Compare   (wfs.ID   , "> ",55).AND.Equal   (wfs.Name, "dth "))
.OrderBy   (new     OrderList(dwfs).DESC   (wfs.ID   ).ASC   (wfs.Name   )).SQL     ;
---------------------
输出:

SELECT   [ID],[Name]   FROM   [WFS]   WHERE   [ID]> 55   AND   [Name]= 'dth '   ORDER   BY   [ID]   DESC,[Name]   ASC

--------------------
其中的字段都定义在实体类中。


[解决办法]
ORM这么繁琐吗?
[解决办法]
有些意义

我也搞了一个适合自己ORM


----------------------
1、在数据库中建立表
----------------------
如:

表名:test_Table
字段 ID,自动号,设置为主键
字段 DM,文本
字段 MC,文本


----------------------
2、建立实体
----------------------
添加引用 using WebMIS.Data.EntityAccess;

/// <summary>
/// 实体映射的例子。
/// </summary>
public class Test_Table:WebMIS.Data.EntityAccess.DBEntity
{
private long _ID = -1;
private string _Code = " ";
private string _Name = " ";

public Test_Table():base( "test_Table ", "ID ") //第一参数为表名,第二参数为主键名
{
}

public long ID
{
get{return _ID;}
set{_ID = value;}
}

public string Code
{
get{return _Code;}
set{_Code = value;}
}

public string Name
{
get{return _Name;}
set{_Name = value;}
}

public override System.Collections.IList GetPrimaryKeyValues()
{
return new long[]{_ID};
}

public override System.Collections.IList GetFields()
{
return new string[]{ "ID ", "dm ", "mc "};
}


public override System.Collections.IList GetFieldValues()
{
return new object[]{_ID,_Code,_Name};
}

public override void LoadFrom(System.Data.DataRow entityDataRow)
{
_ID = long.Parse(entityDataRow[ "ID "].ToString());
_Code = entityDataRow[ "dm "].ToString();
_Name = entityDataRow[ "mc "].ToString();
}
}


----------------------
3、实体管理(实现增、删、改、查功能)
----------------------
输入类名称,一般取实体表+Management就可以,如test_TableManagement.cs

添加引用
using WebMIS.Data.EntityAccess;

public Test_TableManagement(Test_Table entity):base(entity){}

这样

2> 实现增、删、改、查调用方法

实体 oo = new 实体();

实体Management om = new 实体Management(oo);

只要设置
oo.主键属性=值
这样,就可用
om.FillByPK()
实现查询,并把数据写到实体其它属性中

只要设置

oo.属性1=...
oo.属性2=...

这样,就可用
om.Insert()
om.Update()
实现插入,更新
[解决办法]


因为字段如果太多,写这些代码

public override System.Collections.IList GetPrimaryKeyValues()
{
return new long[]{_ID};
}

public override System.Collections.IList GetFields()
{
return new string[]{ "ID ", "dm ", "mc "};
}


public override System.Collections.IList GetFieldValues()
{
return new object[]{_ID,_Code,_Name};
}

public override void LoadFrom(System.Data.DataRow entityDataRow)
{
_ID = long.Parse(entityDataRow[ "ID "].ToString());
_Code = entityDataRow[ "dm "].ToString();
_Name = entityDataRow[ "mc "].ToString();
}

感觉也累,所以,映射有另一种方式


/// <summary>
/// 实体映射的例子。
/// </summary>
//描述映射的表名,主键(主键可多个),如 ( "myTable ", "ID,NO ")或( "myTable ", "ID ", "NO "),可写在类申明上,也可写在无参公有构造函数上,且类上优先。
[WebMIS.Data.EntityAccess.MapAttribute.TableMap( "Tbl_Department ", "ID ")]
public class EntityMapTest:WebMIS.Data.EntityAccess.EntityAutoMap
{
private long _ID;
private string _Code ;
private string _Name ;

public string abc= " ";
public static string ABCD
{
get{return "ABCD1 ";}
}

//描述映射的表名,主键(主键可多个),如 ( "myTable ", "ID,NO ")或( "myTable ", "ID ", "NO "),可写在类申明上,也可写在无参公有构造函数上。
//[WebMIS.Data.EntityAccess.MapAttribute.TableMap( "Tbl_Department ", "ID ")] //表名,主键(可多个),如 ( "myTable ", "ID,NO ")或( "myTable ", "ID ", "NO ")
public EntityMapTest()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap( "ID ",System.Data.DbType.UInt32)]
public long ID
{
get{return _ID;}
set{_ID = value;}
}

[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap( "dm ")]
public string Code
{
get{return _Code;}
set{_Code = value;}
}


[WebMIS.Data.EntityAccess.MapAttribute.ColumnMap( "mc ")]
public string Name
{
get{return _Name;}
set{_Name = value;}
}

[WebMIS.Data.EntityAccess.MapAttribute.Operation( "dm,mc ")]
public void UpdateFieldTest()
{
//...
}
}


还有一种选择,就是用XML定义

总之,没有哪个最好,只有适合自己的才是合理的
[解决办法]
不觉得orm比sql好
[解决办法]
麻烦是语言的原因。没有栈对象、没有过程性函数的语言必然遇上这样的问题。

热点排行