最经在完善自己写的数据访问层,感到非常不灵活,如:BLL中获取泛型对象 ,每次添加一个条件的时候会写很多代码,很烦
1 public List<h_genby> GetList(string day, int status) 2 { 3 return data.getList<h_genby>("EntryDate='" + DateTime.Parse(day) + "' and Status='" + status + "'"); 4 }
getList方法是这个:(根据sql条件获取sql数据库满足的对象)
public List<T> getList<T>(string Sql) { return getList<T>(Sql, false); } public List<T> getList<T>(string Sql, bool filter) { string tableName = typeof(T).Name; try { DataTable dt = new DataTable(); if (Sql.ToLower().Trim().StartsWith("select")) { dt = SqlHelper.QueryTable(Sql); } else { dt = SqlHelper.QueryTable(string.Format("select * from {0} where {1}", tableName, Sql)); } if (dt.Rows.Count > 0) { List<T> lst = Activator.CreateInstance<List<T>>(); foreach (DataRow row in dt.Rows) { T obj = Activator.CreateInstance<T>(); foreach (DataColumn col in dt.Columns) { try { obj.GetType().GetProperty(col.ColumnName).SetValue(obj, row[col], null); } catch { } } lst.Add(obj); } return lst; } else { throw new Exception("数据库没有此数据"); } } catch (Exception ex) { return new List<T>(); } }
写了这么多,我就是想问如何实现像这样的格式,目的是为了更加方便写业务逻辑条件
Public List<T> GetList<T>(Day:day,Status:1)
{
}
Day、Status表示T对象中的属性,day、1表示传过来的值赋给Day、Status,可以自定义添加像重载方法那样。。。教教小弟,大牛们。。。
研究一下Dapper吧!拼Sql的,性能又快!或者也可以试试mysql+ef。拼Linq,也很便捷,当封装好了之后,就可以借助T4模板生成了!慢慢来。
public JsonResult GetMylog(int theid = 0, int typeid = 0)
{
List<AuditorLog> list = AuditorLog.GetQuery(o => o.TheID == theid && o.TypeID == typeid && o.AuditorID == _userid);
return base.Json(list);
}
多潇洒!呼呼!
你应该学习一下Expression相关的知识了。
表达式树
表达式树对你来说太早了。去学Dapper吧
简单点就直接反射。。
GetList<T>(obj) obj = new{predicate1 = "",predicate2=""}。。如果要like之类的,那么就需要在逻辑中,处理一下。
逻辑中,用反射来那obj对象,然后组合条件。
可以参考现有的微型ORM:Petapoco,Dapper等~