无法将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 有效,但它非常非常慢。

对成功的演员有什么建议吗?

无法将<TakeIterator>d__3a'1[System.Object] 转换为键入 System.Collect

尝试关注 -

repository.InsertAllOnSubmit(list.Take(100).Cast<Activity>());

Cast扩展方法允许您将枚举对象从一种类型强制转换为另一种类型(当然,假设强制转换是有效的......这是您对显式强制转换的期望)。