使用这个C#方法,我可以从.csv文件读取到一个契约列表,在这个列表中,CsvHelper通过其字段映射器工作得很好。
public static List<Contract> readDataFile(string filePath)
{
List<Contract> contracts = new List<Contract> { };
using var reader = new StreamReader(filePath);
var config = new CsvConfiguration(CultureInfo.CurrentCulture) {
Delimiter = ";",
PrepareHeaderForMatch = args => args.Header.ToLowerInvariant()
};
using var csvReader = new CsvReader(reader, config);
{
csvReader.Context.RegisterClassMap<ContractMap>();
IEnumerable<Contract> dataContracts = csvReader.GetRecords<Contract>();
foreach (Contract c in dataContracts)
{
contracts.Add(c);
}
}
}就像这样,我想把它转换成一个SqlDataReader,但它没有一个带有<T>映射器的GetRecords。我是.NET核心的新手,并且一直在四处寻找。目前还不清楚什么是正确的方法。
因此,谢谢你的任何提示!
有没有什么通用的方法让SqlDataReader转换成一个给定的对象?
澄清
这段代码运行得很好!不需要改变。只是csv数据现在来自DB。查询数据库也能正常工作。我只是简单地搜索一种巧妙的方法,通过SQLReader将相同的数据读入相同的列表。
发布于 2021-03-30 18:43:24
你不能得到一个SqlDataReader,因为SqlDataReader是的,特别是一个与SQL Server对话的SqlClient实现,而你不是。不过,您可以获得一个IDataReader:假设您谈论的是this CsvHelper,则有一个CsvDataReader在构造函数中接受一个CsvReader实例,并实现IDataReader。对于大多数常见场景,这应该足够了(尽管可以说,如果它是从DbDataReader派生而来的话会更好)。例如,它可以通过以下方式与Dapper一起使用:
using var dataReader = new CsvDataReader(csvReader);
var deserializer = SqlMapper.GetTypeDeserializer(typeof(Contract), dataReader);
while (dataReader.ReadNext())
{
var c = (Contract)deserializer(dataReader);
// whatever you want to do with that
}如果你的意思是你只想使用像GetRecords<T>这样的东西,但是使用SqlDataReader而不是CsvHelper (完全去掉CsvHelper ):那么-几乎任何对象关系映射都可以。不过,您可能也会让ORM担心数据读取器部分;例如(同样,为了方便起见,我在这里使用Dapper ):
using var conn = // ... create a connection
string region = ...
var data = conn.Query<Contact>(
"select * from Contacts where Region=@region", // sql
new { region } // parameters
).AsList();或者像EF这样的东西通过LINQ:
string region = ...
var data = dbContext.Contacts.Where(x => x.Region == region).ToList();https://stackoverflow.com/questions/66868771
复制相似问题