public
static
void
BulkInsert
<
T
>(
string
connection
,
string
tableName
,
IList
<
T
>
list
)
{
using
(
var
bulkCopy
=
new
SqlBulkCopy
(
connection
))
{
bulkCopy
.
BatchSize
=
list
.
Count
;
bulkCopy
.
DestinationTableName
=
tableName
;
var
table
=
new
DataTable
();
var
props
=
TypeDescriptor
.
GetProperties
(
typeof
(
T
))
//Dirty hack to make sure we only have system data types
//i.e. filter out the relationships/collections
.
Cast
<
PropertyDescriptor
>()
.
Where
(
propertyInfo
=>
propertyInfo
.
PropertyType
.
Namespace
.
Equals
(
"System"
))
.
ToArray
();
foreach
(
var
propertyInfo
in
props
)
{
bulkCopy
.
ColumnMappings
.
Add
(
propertyInfo
.
Name
,
propertyInfo
.
Name
);
table
.
Columns
.
Add
(
propertyInfo
.
Name
,
Nullable
.
GetUnderlyingType
(
propertyInfo
.
PropertyType
)
??
propertyInfo
.
PropertyType
);
}
var
values
=
new
object
[
props
.
Length
];
foreach
(
var
item
in
list
)
{
for
(
var
i
=
0
;
i
<
values
.
Length
;
i
++)
{
values
[
i
]
=
props
[
i
].
GetValue
(
item
);
}
table
.
Rows
.
Add
(
values
);
}
bulkCopy
.
WriteToServer
(
table
);
}
}
string sql = context.CreateObjectSet<T>().ToTraceString();
public static class ContextExtensions { public static string GetTableName<T>(this DbContext context) where T : class { ObjectContext objectContext = ((IObjectContextAdapter) context).ObjectContext; return objectContext.GetTableName<T>(); } public static string GetTableName<T>(this ObjectContext context) where T : class { string sql = context.CreateObjectSet<T>().ToTraceString(); Regex regex = new Regex("FROM (?<table>.*) AS"); Match match = regex.Match(sql); string table = match.Groups["table"].Value; return table; } }
DbContext context = ....;
string table = context.GetTableName<Album>();