C#数据访问层怎么简化查询?如果我有两个都是不同的查询功能,查询的一些代码会冗余,想简化代码。都是最基本的访问数据库ADO.NET

Martin-Liu 2013-07-15 05:48:28
如果我有两个查询功能(都是返回集合):1.查询用户信息。2.查询新闻信息。这样查询的除了sql语句和返回集合的泛型不同,其他都是一样的,本人想简化下代码,将共同的部分提取出来?请问有什么办法,对于查询不同的sql语句,返回不同的泛型集合,怎么去控制这个泛型呢?有一个小小的思路就是通过反射,但是能根据不同的sql语句查询不同的信息,但是返回的泛型集合有不同。
...全文
87 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
winner2050 2013-07-15
  • 打赏
  • 举报
回复
版主还是别帮着写代码了。 这种过度封装,害处太多。
Martin-Liu 2013-07-15
  • 打赏
  • 举报
回复
引用 2 楼 soaringbird 的回复:
从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"] };

                });
我有点看不懂你这用到Lambda表达式了。但是我感觉你这思路还是能明白的,可能有点深吧
Martin-Liu 2013-07-15
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
反射就很好。如果你担心反射性能不行,在.NET 4.0以上版本,可以借助Expression.MemberAccess构造Lambda去赋值,它在IL层面上翻译为直接对属性的操作,比反射快很多。
反射是很好,但是我不是很会用,如果根据传递sql语句查询不同返回的集合泛型也不同,那我这个泛型应该怎么办?
soaringbird 2013-07-15
  • 打赏
  • 举报
回复
从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"] };

                });
threenewbee 2013-07-15
  • 打赏
  • 举报
回复
反射就很好。如果你担心反射性能不行,在.NET 4.0以上版本,可以借助Expression.MemberAccess构造Lambda去赋值,它在IL层面上翻译为直接对属性的操作,比反射快很多。

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧