无法转换<takeiterator> d__3a`1 [System.Object]以键入System.Collections.Generic.IEnumerable </takeiterator>

时间:2014-12-14 08:33:23

标签: c# csv generics repository-pattern

我有一个将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可以工作,但它非常慢。

任何关于演员成功的建议?

1 个答案:

答案 0 :(得分:2)

尝试以下操作 -

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

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