1

SQlサーバーにいくつかのテーブルを設定しています。これらすべてを通常のLinqToSqlで使用するためにdbmlファイルに転送しました。

リンクされたテーブルではなく、テーブルの列のみを選択するようにコードのクラスを変更することは可能かどうか疑問に思っています

つまり、リンクされたテーブルプロパティのないメソッドにクラスを渡したい場合は、どうすればよいでしょうか。

詳細情報基本的に、context.SubmitChangesの代わりにSQLbulkCopyを使用するために作成した拡張機能を使用しようとしていますが、追加のプロパティが原因でマッピングの問題が発生します

匿名型を使用できることはわかっていますが、Extensionメソッドの利点が上書きされると思いました。もう1つのオプションは、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 に答える