c#数据库映射器

本文关键字:映射 数据库 | 更新日期: 2023-09-27 18:12:07

我希望将我的数据库查询结果映射到我的c#代码中的强类型对象。因此,我在SqlConnection类上编写了一个快速而肮脏的助手方法,该方法在数据库上运行查询,并使用反射将记录列映射到对象属性。代码如下:

 public static T Query<T>(this SqlConnection conn, string query) where T : new()
    {
        T obj = default(T);
        using (SqlCommand command = new SqlCommand(query, conn))
        {
            using (SqlDataReader reader = command.ExecuteReader())
            {
                while (reader.Read())
                {
                    obj = new T();
                    PropertyInfo[] propertyInfos;
                    propertyInfos = typeof(T).GetProperties();
                    for (int i = 0; i < reader.FieldCount; i++)
                    {
                        var name = reader.GetName(i);
                        foreach (var item in propertyInfos)
                        {
                            if (item.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase) && item.CanWrite)
                            {
                                item.SetValue(obj, reader[i], null);
                            }
                        }
                    }
                }
            }
        }
        return obj;
    }

  public class User
    {
        public int id { get; set; }
        public string firstname { get; set; }
        public string lastname { get; set; }
        public DateTime signupDate { get; set; }
        public int age { get; set; }
        public string gender { get; set; }
    }

   var user = conn.Query<User>("select id,firstname,lastname from users");      

我只是想要一个关于我上面使用反射将值绑定在一起的方法的第二个意见,如果有什么我可以在上面的代码中做得更好。或者是否有其他完全不同的方法可以得到相同的结果?

我想我可以通过删除propertyinfo的循环和使用字典来改进helper方法中的代码。还有什么需要调整的吗?

p。S:我知道Dapper,我只是想自己实现一些类似的东西,以帮助我更好地学习。

c#数据库映射器

您所做的基本上就是linq-to-sql或其他or映射器在底层所做的。要了解它如何工作的细节,从头开始写一些东西总是一个好主意。

如果你想要更多的灵感,或者想要一些现成的东西用于生产,我建议你阅读一下linq-to-sql。

我能想到一些事情:

  1. 我认为为了跳过循环,你可以使用:

    reader[item.Name]
    
  2. 我自己也做过类似的事情,但我从来没有遇到过dapper。我不确定它是否使用反射,但阅读别人的代码来提高你的技能总是一个好主意(Scott Hanselman经常建议这样做)。

  3. 你也可以看看:http://www.codeproject.com/KB/database/metaquery_part1.aspx

  4. 您可以实现将字段映射到数据库列的属性,但这只是为了好玩。

编辑:

5:您还可以跳过reader上的while循环,只取第一行,并记录您的查询只返回一个对象的事实,因此如果查询返回1000行,它不会拉出1000行。