bulk insert with linq-to-sql

前端 未结 5 1971
梦谈多话
梦谈多话 2020-12-08 11:35

I have a query that looks like this:

using (MyDC TheDC = new MyDC())
{
   foreach (MyObject TheObject in TheListOfMyObjects)
   {
      DBTable TheTable = ne         


        
5条回答
  •  独厮守ぢ
    2020-12-08 11:53

    I modified the code from the following link to be more efficient and used it in my application. It is quite convenient because you can just put it in a partial class on top of your current autogenerated class. Instead of InsertOnSubmit add entities to a list, and instead of SubmitChanges call YourDataContext.BulkInsertAll(list).

    http://www.codeproject.com/Tips/297582/Using-bulk-insert-with-your-linq-to-sql-datacontex

    partial void OnCreated()
    {
        CommandTimeout = 5 * 60;
    }
    
    public void BulkInsertAll(IEnumerable entities)
    {                        
        using( var conn = new SqlConnection(Connection.ConnectionString))
        {
            conn.Open();
    
            Type t = typeof(T);
    
            var tableAttribute = (TableAttribute)t.GetCustomAttributes(
                typeof(TableAttribute), false).Single();
            var bulkCopy = new SqlBulkCopy(conn)
            {
                DestinationTableName = tableAttribute.Name
            };
    
            var properties = t.GetProperties().Where(EventTypeFilter).ToArray();
            var table = new DataTable();
    
            foreach (var property in properties)
            {
                Type propertyType = property.PropertyType;
                if (propertyType.IsGenericType &&
                    propertyType.GetGenericTypeDefinition() == typeof(Nullable<>))
                {
                    propertyType = Nullable.GetUnderlyingType(propertyType);
                }
    
                table.Columns.Add(new DataColumn(property.Name, propertyType));
            }
    
            foreach (var entity in entities)
            {
                table.Rows.Add(
                    properties.Select(
                    property => property.GetValue(entity, null) ?? DBNull.Value
                    ).ToArray());
            }
    
            bulkCopy.WriteToServer(table);
        }                                               
    }
    
    private bool EventTypeFilter(System.Reflection.PropertyInfo p)
    {
        var attribute = Attribute.GetCustomAttribute(p,
            typeof(AssociationAttribute)) as AssociationAttribute;
    
        if (attribute == null) return true;
        if (attribute.IsForeignKey == false) return true;
    
        return false;
    }
    

提交回复
热议问题