C#数据访问层怎么简化查询?如果我有两个都是不同的查询功能,查询的一些代码会冗余,想简化代码。都是最基本的访问数据库ADO.NET
如果我有两个查询功能(都是返回集合):1.查询用户信息。2.查询新闻信息。这样查询的除了sql语句和返回集合的泛型不同,其他都是一样的,本人想简化下代码,将共同的部分提取出来?请问有什么办法,对于查询不同的sql语句,返回不同的泛型集合,怎么去控制这个泛型呢?有一个小小的思路就是通过反射,但是能根据不同的sql语句查询不同的信息,但是返回的泛型集合有不同。 C# ADO.NET
[解决办法]
反射就很好。如果你担心反射性能不行,在.NET 4.0以上版本,可以借助Expression.MemberAccess构造Lambda去赋值,它在IL层面上翻译为直接对属性的操作,比反射快很多。
[解决办法]
从sp兄那学来的:
public IEnumerable<T> ExecuteQuery<T>(string sql, DbParameter[] ps, Func<DbDataReader, T> proc)
{
var str = "Data Source=.;Initial Catalog=TestDB;Integrated Security=True";
using (DbConnection con = new SqlConnection(str))
{
con.Open();
var cmd = con.CreateCommand();
cmd.CommandText = sql;
if (ps != null)
cmd.Parameters.AddRange(ps);
var reader = cmd.ExecuteReader();
while (reader.Read())
yield return proc(reader);
}
}
var list = ExecuteQuery(sql, null, reader =>
{
return new Class1 { ID = (int)reader["ID"], Name = (string)reader["Name"], Data = (string)reader["Data"] };
});