• 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")

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

    //文章结束

  • 相关阅读:
    js转盘游戏
    wps excel
    微软笔记本
    图片识别
    数据库 连接 集
    Vue + Element UI 实现权限管理系统 前端篇(十二):用户管理模块
    Vue + Element UI 实现权限管理系统 前端篇(十三):页面权限控制
    Vue + Element UI 实现权限管理系统 前端篇(十四):菜单功能实现
    Vue + Element UI 实现权限管理系统 前端篇(十五):嵌套外部网页
    Vue + Element UI 实现权限管理系统 前端篇(九):接口格式定义
  • 原文地址:https://www.cnblogs.com/teddyma/p/219543.html
Copyright © 2020-2023  润新知