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好
[解决办法]
麻烦是语言的原因。没有栈对象、没有过程性函数的语言必然遇上这样的问题。