【机房合作】新知识尝试
在这次机房合作中,学到了很多新的知识。因为我负责的D层,所以就来写一下在D层方面的尝试。
机房重构的时候,用的都是Datatable,机房合作的时候,小伙伴想要List的返回值,但是要一个List返回值,就转一下,代码量很多,而且一点儿也不简洁,所以就写了一个公共类。
public class ConvertHelper<T> where T:new ()
{
public static List<T> ConvertToList(DataTable table)
{
//定义集合
List<T> list = new List<T>();
//获得T模型的类型
Type type = typeof(T);
string tempName = "";
foreach (DataRow row in table.Rows)
{
T t = new T();
//获得此模型的公共属性
PropertyInfo[] propertys = t.GetType().GetProperties();
//遍历该对象的所有公共属性
foreach (PropertyInfo pi in propertys)
{
//将属性名称赋值给临时变量
tempName = pi.Name;
//检查DataTable是否包含此列(列名==对象的属性名)
if (table.Columns.Contains(tempName))
{
//判断此属性是否有Setter
if (!pi.CanWrite) continue;//该属性不可写,直接跳出
//取值
object value = row[tempName];
//如果非空,则赋给对象的属性
if (value != DBNull.Value)
pi.SetValue(t, value, null);
}
}
//对象添加到泛型集合中
list.Add(t);
}
return list;
}
}
需要将Datatable转为List返回值时,在D层只需要两行代码即可:
//调用ConvertToList公共方法,来实现datatable转list
List<LineInfo> list = ConvertHelper<LineInfo>.ConvertToList(table);
return list;
大大减少了代码量,完美~
我们实现代码,一天半的时间都不到。我觉得很大一部分原因在于,尝试使用了字典拼接。
字典(Dictionary)里面的每一个元素都是一个键值对(由二个元素组成:键和值) ,在字典中,键必须是唯一的,而值不需要唯一的。其中键和值都可以是任何类型(比如:string, int, 自定义类型,等等)
我们使用字典的原因就是,有时候很多SQL查询语句大部分都是一样的,只不过有的是实现查询卡号,有的是实现查询姓名,有的是实现查询性别,有的是没有什么限制条件。如果我需要查询卡号,SQL语句就能去查询卡号,我需要查询性别,SQL语句就能去查询性别,而且一条语句就能完成,字典拼接
以查询消费者记录为例,其中返回值为List,参数为字典:
public List<CustomerInfo> SelectAllCustomer(Dictionary<string, string> dic)
{
//查询所有的消费者
string sql = "select * from T_Customer where 1=1,IsDelete=0";
//查询语句实现字典拼接,查询内容由传过来的键值决定
List<SqlParameter> listP = new List<SqlParameter>();
//如果字典中有内容,则走该循环,否则直接执行SQL语句,查询所有的消费者
if (dic.Count>0)
{
foreach (var pair in dic)
{
//SQL语句进行字典拼接,实现多条件查询
sql += " and CustomerInfo." + pair.Key + "=@" + pair.Key;
listP.Add(new SqlParameter("@" + pair.Key, pair.Value));
}
}
DataTable table = helper.ExecuteQuery(sql, listP.ToArray(), CommandType.Text);
//调用ConvertToList公共方法,来实现datatable转list
List<CustomerInfo> list = ConvertHelper<CustomerInfo>.ConvertToList(table);
return list;
}
希望能够给你一些帮助~
感谢您的阅读~