从sql db表中列出(T)

时间:2012-03-10 10:34:58

标签: c# sql

我想从sql db table

创建List(T)

假设我有一张桌子

ID    Name  
1     xyz   
2     efd
3     abc
4     pqr

我想在C#中使用一些代码来读取这个db表数据并写入 我的c#class或/ notepad中的以下行或其他...

List<ItemViewModel> Items= new List<ItemViewModel>();
   Items.Add(new ItemViewModel() { id= 1, name= "xyz"}
   Items.Add(new ItemViewModel() { id= 2, name= "efd"}
   Items.Add(new ItemViewModel() { id= 3, name= "abc"}
   Items.Add(new ItemViewModel() { id= 4, name= "pqr"}

提前致谢

4 个答案:

答案 0 :(得分:2)

将“dapper”添加到您的项目中(在NuGet上可用),然后:

var list = connection.Query<YourType>("select * from TableName").ToList();

或无参数查询:

var region = "South";
var list = connection.Query<YourType>(
    "select * from TableName where Region=@region", new { region });

答案 1 :(得分:1)

这是您可以获得的最佳代码之一,以下方法可以处理任何数据类和系统定义的类型:

public List<T> ExecuteQuery<T>(string s, SqlConnection condb, params SqlParameter[] Params)
{
    List<T> res = new List<T>();
    string er = "";
    SqlDataReader r = null;
    try {
        if (condb == null)
            throw new Exception("Connection is NULL");
        if (string.IsNullOrEmpty(s))
            throw new Exception("The query string is empty");
        using (SqlCommand cm = new SqlCommand(s, condb)) {
            if (Params.Length > 0) {
                cm.Parameters.AddRange(Params);
            }
            if (cm.Connection.State != ConnectionState.Open)
                cm.Connection.Open();
            r = cm.ExecuteReader;

            object prps = typeof(T).GetProperties;
            object prpNames = prps.Select((System.Object f) => f.Name).ToList;

            if (r.HasRows) {
                while (r.Read) {
                    if (typeof(T).FullName.Contains("System.")) {
                        res.Add(r(0));
                    // Classes
                    } else {
                        object c = Activator.CreateInstance(typeof(T));
                        for (j = 0; j <= r.FieldCount - 1; j++) {
                            object jj = j;
                            //er = dt.Rows(jj)("ColumnName").ToLower
                            object fname = r.GetName(j).ToString;
                            er = fname;
                            object fType = r.GetProviderSpecificFieldType(j).ToString.ToLower;
                            object p = prps.Where((System.Object f) => f.Name.Trim.ToLower == fname.ToLower).ToList;
                            if (p.Count > 0) {
                                //Date or DateTime
                                if (fType.Contains("date")) {
                                    if (!p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value))) {
                                        p(0).SetValue(c, Now, null);
                                    } else {
                                        if (!(p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value)))) {
                                            p(0).SetValue(c, r(fname), null);
                                        }
                                    }
                                //String
                                } else if (fType.Contains("string")) {
                                    if (r(fname) == null || r(fname).Equals(System.DBNull.Value)) {
                                        p(0).SetValue(c, "", null);
                                    } else {
                                        p(0).SetValue(c, r(fname), null);
                                    }
                                } else {
                                    if (!(p(0).PropertyType.FullName.ToLower.Contains("system.nullable") && (r(fname) == null || r(fname).Equals(System.DBNull.Value)))) {
                                        p(0).SetValue(c, r(fname), null);
                                    }
                                }
                            }
                        }
                        res.Add(c);
                    }
                }
            }
            r.Close();

        }
    //If cm IsNot Nothing Then
    //    'cm.Connection.Close()
    //    cm.Dispose()
    //End If

    } catch (Exception ex) {
        if (r != null && r.IsClosed == false)
            r.Close();
        throw ex;
    }
    return res;
        }

用法:

var data = ExecuteQuery<ItemViewModel>("SELECT [ID], [Name] FROM [ItemViewTable]",
                                       new SqlConnection("SomeConnectionString"));

答案 2 :(得分:1)

如果您只想要填充数据库表中当前数据的列表,则可以执行简单查询。您不必涉及代码生成。

使用linq-to-sql读取表的内容并为每个条目创建ItemViewModel

using(var context = new MyLinqDbContext())
{
    var items = (from i in context.MyTable
                 select new ItemViewModel { id = ID, name = Name })
                .ToList();
}

答案 3 :(得分:-1)

如果您希望生成的C#代码是从数据库值创建并编译到您的解决方案中的,那么您需要使用微软文本模板引擎(T4)。要掌握这项技术,您可以详细阅读in this blog entry

如果你了解T4的基础知识,你可以阅读this blog,这是一个如何动态创建存储在数据库中的静态查找表的枚举类的例子。从这段代码开始,您可以编写自己的代码生成模板,创建所需的类。