无法将d__3a'1[System.Object] 转换为键入 System.Collect
本文关键字:System Object 转换 Collect TakeIterator 3a | 更新日期: 2023-09-27 18:34:08
我有一个将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/上读取的那样,但没有成功。而且我不想使用 ToList,因为由于大小原因,我无法在内存中设置整个文件。
我评论了我在存储库类中使用 foreach 的行,foreach 有效,但它非常非常慢。
对成功的演员有什么建议吗?
尝试关注 -
repository.InsertAllOnSubmit(list.Take(100).Cast<Activity>());
Cast
扩展方法允许您将枚举对象从一种类型强制转换为另一种类型(当然,假设强制转换是有效的......这是您对显式强制转换的期望)。