PropertyEnumerators For Entity Objects in LiteMDA

LiteMDA中,Load、Update和Delete都需要传入一个ICondition参数,ICondition包含了用于查询的条件,这样的条件,对于ORM来将,最终肯定是一组子条件的组合,比如Condition.Add("User.Name", OP.Equals, "teddy"),这样的语句有什么问题呢?主要是,条件Name需要手工输入,如果手误输了一个不存在的名称,也只有在运行时才会报错,所以,有必要提供一个现示的机制来,来避免这样的错误。双鱼座在一年以来我最好的创意中介绍了他在Kanas.Net中的一种实现,这里是我在LiteMDA中的实现,原理基本相似,就是在由辅助工具生成实体类的同时,生成一组我称为PropertyEnumerators的实体类属性词典。

以下的示例表示两个实体类User和Profile,每个User包含一个Profile属性。

UserPropertyEnumerator.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace LiteMDA.Test.Entitys.PropertyEnumerators
{
    
public class UserPropertyEnumerator
    
{
        
private string _Prefix = null;
        
private string _ID = "User.ID";
        
private string _Name = "User.Name";

        
public string ID
        
{
            
get
            
{
                
return (_Prefix != null && _Prefix.Length > 0 ? string.Format("{0}.{1}", _Prefix, _ID) : _ID);
            }

        }


        
public string Name
        
{
            
get
            
{
                
return (_Prefix != null && _Prefix.Length > 0 ? string.Format("{0}.{1}", _Prefix, _Name) : _Name);
            }

        }


        
public ProfilePropertyEnumerator Profile;

        
public UserPropertyEnumerator()
        
{
            
this.Profile = new ProfilePropertyEnumerator("User");
        }


        
public UserPropertyEnumerator(string prefix)
        
{
            _Prefix 
= prefix;
            
this.Profile = new ProfilePropertyEnumerator(string.Format("{0}.{1}", _Prefix, "User"));
        }

    }

}


ProfilePropertyEnumerator.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace LiteMDA.Test.Entitys.PropertyEnumerators
{
    
public class ProfilePropertyEnumerator
    
{
        
private string _Prefix = null;
        
private string _ID = "Profile.ID";
        
private string _LiveCity = "Profile.LiveCity";

        
public string ID
        
{
            
get
            
{
                
return (_Prefix != null && _Prefix.Length > 0 ? string.Format("{0}.{1}", _Prefix, _ID) : _ID);
            }

        }


        
public string LiveCity
        
{
            
get
            
{
                
return (_Prefix != null && _Prefix.Length > 0 ? string.Format("{0}.{1}", _Prefix, _LiveCity) : _LiveCity);
            }

        }


        
public ProfilePropertyEnumerator()
        
{
        }


        
public ProfilePropertyEnumerator(string prefix)
        
{
            _Prefix 
= prefix;
        }


    }

}


Entity.cs

using System;
using System.Collections.Generic;
using System.Text;

namespace LiteMDA.Test.Entitys.PropertyEnumerators
{
    
public class Entity
    
{
        
public static PropertyEnumerators.UserPropertyEnumerator User = new LiteMDA.Test.Entitys.PropertyEnumerators.UserPropertyEnumerator();
        
public static PropertyEnumerators.ProfilePropertyEnumerator Profile = new LiteMDA.Test.Entitys.PropertyEnumerators.ProfilePropertyEnumerator();
    }

}


通过以上这样的定义,我就可以以如下的方式来添加查询条件子句:

Condition.Add(Entity.User.Name, OP.Equals, "teddy").And(Entity.User.Profile.LiveCity, OP.Equals, "shanghai")

从而避免了以上提到“手误”可能导致的编译时不能发现的错误。

//文章结束

posted @ 2005-08-21 13:53  Teddy's Knowledge Base  Views(1578)  Comments(27Edit  收藏  举报