我有一个将CSV文件读取到数据库的过程。这个csv超过600 Mb所以我无法将所有内存设置在内存中。 我使用通用模式来实现这一点,但我在构建时遇到了问题:
我在这里阅读文件
using (var fs = File.OpenText(Path.Combine(FolderContainer, filename)))
{
var csvConfiguration = new CsvConfiguration
{
HasHeaderRecord = true,
Delimiter = ","
};
using (var csvReader = new CsvReader(fs, csvConfiguration))
{
csvReader.Configuration.RegisterClassMap(CsvMapping.CsvMapping.RetrieveMapType(type));
var list = csvReader.GetRecords(type);
// Console.WriteLine(list.First());
dynamic repository = Activator.CreateInstance(typeof(Repository<>).MakeGenericType(type), UnitOfWork);
// var activities = new Repository<Activity>(UnitOfWork);
repository.InsertAllOnSubmit(list.Take(100));
repository.SubmitChanges();
}
}
我使用Take(100)作为我的测试目的,我使用了一个工作单元InMemory。
这是名为
的Repository方法public void InsertAllOnSubmit(IEnumerable<T> entities)
{
_source.InsertAllOnSubmit(entities);
}
public void InsertAllOnSubmit(IEnumerable<object> entities)
{
// foreach (var entity in entities)
// {
// InsertOnSubmit((T) entity);
// }
this.InsertAllOnSubmit((IEnumerable<T>)entities);
}
当我执行测试时,我有一个castException
System.InvalidCastException : Unable to cast object of type '<TakeIterator>d__3a`1[System.Object]' to type 'System.Collections.Generic.IEnumerable`1[KboOpenDataData.Activity]'.
我尝试在Take {100}之后添加一个AsEnumerable()或ToList()作为http://blog.codelab.co.nz/2009/12/22/unable-to-cast-object-of-type-issue/上的readed,但没有成功。 而且我不想使用ToList,因为我不能因为大小而将整个文件设置在内存中。
我评论了我在存储库类中使用foreach的行,foreach可以工作,但它非常慢。
任何关于演员成功的建议?
答案 0 :(得分:2)
尝试以下操作 -
repository.InsertAllOnSubmit(list.Take(100).Cast<Activity>());
Cast
扩展方法允许您将枚举从一种类型转换为另一种类型(当然假设转换是有效的...这是您对显式转换的期望。)