1

我在 SQl 服务器中设置了许多表,我已将所有这些表转移到 dbml 文件中以供正常的 LinqToSql 使用。

我想知道是否可以将代码中的类更改为仅选择表的列而不选择链接表

即,如果我想将类传递给没有链接表属性的方法,我将如何去做

更多信息本质上我正在尝试使用我编写的扩展以使用 SQLbulkCopy 而不是 context.SubmitChanges 但由于额外的属性而遇到映射问题

我意识到我可以使用匿名类型,但认为这会覆盖扩展方法的任何好处。另一种选择是更改 ToDataTable 扩展。

     public static void SqlBulkInsert<T>(this IEnumerable<T> source, string connectionString, string tableName)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            var bulkCopy = new SqlBulkCopy(conn) {DestinationTableName = tableName};
            conn.Open();
            var item = source.ToDataTable();
            bulkCopy.WriteToServer(item);
            conn.Close();
        }
    }
    public static DataTable ToDataTable<T>(this IEnumerable<T> source)
    {
        using (var dt = new DataTable())
        {
            var toList = source.ToList();

            for (var index = 0; index < typeof(T).GetProperties().Length; index++)
            {
                var info = typeof(T).GetProperties()[index];
                dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
            }

            for (var index = 0; index < toList.Count; index++)
            {
                var t = toList[index];
                var row = dt.NewRow();
                foreach (var info in typeof(T).GetProperties())
                {
                    row[info.Name] = info.GetValue(t, null);
                }
                dt.Rows.Add(row);
            }

            return dt;
        }
    }
4

1 回答 1

0

对,所以我解决了

使用示例

_list = new List<Item>();
//Fill _list
_list.SqlBulkInsert(SettingsFile.ConnectionString,"Table");

我必须定义一个静态列表,并且只处理列表中包含的那些属性类型

一位同事建议在 propertyType 上使用 isclass 属性,但这当然有问题,如果有任何其他方法或我可能错过的东西,我会很高兴接受一些批评

希望这可以帮助某人!

即像这样

      private static List<Type> Types
    {
        get
        {
            return new List<Type>
                   {
                       typeof (String),
                       typeof (int?),
                       typeof (Guid?),
                       typeof (double?),
                       typeof (decimal?),
                       typeof (float?),
                       typeof (Single?),
                       typeof (bool?),
                       typeof (DateTime?),
                       typeof (int),
                       typeof (Guid),
                       typeof (double),
                       typeof (decimal),
                       typeof (float),
                       typeof (Single),
                       typeof (bool),
                       typeof (DateTime),
                       typeof (DBNull)
                   };
        }
    }

 public static DataTable ToDataTable<T>(this IEnumerable<T> source)
    {
        using (var dt = new DataTable())
        {
            var toList = source.ToList();

            for (var index = 0; index < typeof(T).GetProperties().Count(); index++)
            {
                var info = typeof(T).GetProperties()[index];
                if (Types.Contains(info.PropertyType))
                {
                    dt.Columns.Add(new DataColumn(info.Name, info.PropertyType));
                }
            }

            for (var index = 0; index < toList.Count; index++)
            {
                var t = toList[index];
                var row = dt.NewRow();
                foreach (var info in typeof(T).GetProperties())
                {
                    if (Types.Contains(info.PropertyType))
                    {
                        row[info.Name] = info.GetValue(t, null);
                    }
                }
                dt.Rows.Add(row);
            }

            return dt;
        }
    }
于 2012-06-26T12:38:14.873 回答