波斯码BOSSMA Information Technology

ModelQuery – 灵活安全高效的数据查询方式

发布时间:2015年6月28日 / 分类:DataBase, DOTNET / 次浏览 / 评论

关系数据操作有很多方式,微软的Entitiy Framework,又或者NHibernate,还有其它各种数不胜数的ORM框架,为什么还会有ModelQuery?造轮子的理由千千万,大部分都是从某些立场开始,或者从个性化的需求,ModelQuery也是根据自身开发需求量身定做:灵活、安全、高效,可以灵活处理各种查询,可以保证数据操作安全,开发效率和程序运行效率都要高。

ModelQuery 通过定义一个查询类及其属性实现对特定业务数据的查询操作。

/// <summary>
/// SysUser
/// </summary>
public partial class SysUserQueryModel
{
    ...
}

 

1、每个属性代表一个查询条件,属性的值可以是一个单一的数据,也可以是一组数据:

UserName属性的值是一个单一的数据,表示UserName=value的查询条件。

    /// <summary>
    /// UserName
    /// </summary>
    public string UserName
    {
        get
        {
            var con = m_ConditionList.Where(t => t.ConditionName == "UserName").FirstOrDefault();
            if (con != null)
            {
                return (string)con.Value;
            }

            return null;
        }

        set
        {
            if (value != null)
            {
                m_ConditionList.Add(new QueryCondition()
                {
                    CompareType = CompareType.Equal,
                    LinkType = LinkType.And,
                    Property = "UserName",
                    ConditionName = "UserName",
                    Value = value
                });
            }
        }
    }

MutliStatus属性的值是一个int数组,表示Status in (value1,value2,…)的查询条件。

    /// <summary>
    /// MutliStatus
    /// </summary>
    public int[] MutliStatus
    {
        get
        {
            var con = m_ConditionList.Where(t => t.ConditionName == "MutliStatus").FirstOrDefault();
            if (con != null)
            {
                return (int[])con.Value;
            }

            return null;
        }

        set
        {
            if (value != null)
            {
                m_ConditionList.Add(new QueryCondition()
                {
                    CompareType = CompareType.In,
                    LinkType = LinkType.And,
                    Property = "Status",
                    ConditionName = "MutliStatus",
                    Value = value
                });
            }
        }
    }

2、每个查询条件可以定义查询比较的方式(等于、不等于、包含、不包含等),并在赋值时初始化:

请查看1中的属性赋值部分: CompareType = CompareType.In ,CompareType定义如下:

public enum CompareType
{
    Like,
    GET,
    GT,
    LT,
    LET,
    Equal,
    NotEqual,
    In,
    NotIn,
    Is,
    IsNot
}

3、查询条件之间的关系(如And、Or等)由相关的属性定义,并在赋值时初始化:

请查看1中的属性赋值部分:LinkType = LinkType.And,LinkType定义如下:

public enum LinkType
{
    And,
    Or,
    Nothing
}

4、可以对同一个数据字段定义不同的查询条件(也就是属性),方便在不同的需求下使用:

NoUserName属性针对UserName字段,表示UserName<>value的查询条件。

    /// <summary>
    /// NoUserName
    /// </summary>
    public string NoUserName
    {
        get
        {
            var con = m_ConditionList.Where(t => t.ConditionName == "NoUserName").FirstOrDefault();
            if (con != null)
            {
                return (string)con.Value;
            }

            return null;
        }

        set
        {
            if (value != null)
            {
                m_ConditionList.Add(new QueryCondition()
                {
                    CompareType = CompareType.NotEqual,
                    LinkType = LinkType.And,
                    Property = "UserName",
                    ConditionName = "NoUserName",
                    Value = value
                });
            }
        }
    }

5、最终根据查询类的实例生成参数化的查询条件和参数数组,提交给数据库操作类执行:

    /// <summary>
    /// 获取符合查询条件的全部数据
    /// </summary>
    public List<Demo.ModelQuery.Model.SysUserModel> GetList(Demo.ModelQuery.Model.SysUserQueryModel query)
    {
        // 从查询条件获取SQL条件语句
        string strWhere = ConditionToSql.ToSqlText(query.Condition);
        SqlParameter[] paras = ConditionToSql.ToSqlParas(query.Condition);

        // 构造SQL查询语句
        StringBuilder strSql = new StringBuilder();
        strSql.Append("select * ");
        strSql.Append(" FROM SysUser ");
        if (strWhere.Trim() != "")
        {
            strSql.Append(" where " + strWhere);
        }

        // 执行查询
        DataSet ds = DbHelperSQL.Query(strSql.ToString(), paras);

        // 转换查询结果为List<T>,并返回
        return DataTableToList(ds.Tables[0]);
    }

6、以上这些定义完毕,来看看怎么使用:

        SysUserDAL dal = new SysUserDAL();
        var list = dal.GetList(new ModelQuery.Model.SysUserQueryModel()
        {
            Status = 1
        });

        Console.WriteLine("查询结果数量:" + list.Count);
        Console.ReadLine();

方便安全高效,再也不用担心拼SQL的烦扰了。

但是实际情况中一条记录往往都有很多的查询条件,如果一个个定义岂不是累尿了。

目前有很多的代码生成方案可以帮我们解决这些问题,这里提供一个解决方案:使用基于数据表的动软代码生成器的自定义模板功能生成模型类、模型查询类、数据操作类,然后使用起来就像上边一样so easy了。模板已经放到/Demo/Template目录下,可以根据自己的需要修改,模板语言使用C#编码风格,好用又easy。

项目源码地址:https://github.com/bosima/DbUtility,赶紧来试试吧。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯码,原文地址《ModelQuery – 灵活安全高效的数据查询方式

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

发表评论