关系数据操作有很多方式,微软的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 数据查询
发表评论
相关文章
国内AI资源汇总,AI聊天、AI绘画、AI写作、AI视频、AI设计、AI编程、AI音乐等,国内顺畅访问,无需科学上网。
扫码或点击进入:萤火AI大全
文章分类
最新评论