我有一个动态变量,它可以是我的数据库中每个表的名称。
这是我想要获取的数据的示例
var tableData = _context.Users.ToList();
But the Users
应作为字符串传入。
我尝试过的:
// Exception: System.InvalidOperationException: 'Cannot create a DbSet for 'object' because this type is not included in the model for the context.'
var tableData = _context.Set<object>().FromSqlRaw($"SELECT * FROM {tableName}").ToList();
// Returned -1
var tableData = _context.Database.ExecuteSqlRaw($"SELECT * FROM {tableName}");
收到数据后,我调用以下函数来获取 a 的字节.CSV
file.
public byte[] ExportToCsv<T>(IEnumerable<T> data)
{
using var memoryStream = new MemoryStream();
using var streamWriter = new StreamWriter(memoryStream);
using var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
csvWriter.WriteRecords(data);
streamWriter.Flush();
return memoryStream.ToArray();
}
我该如何解决这个问题?
使用 Microsoft.EntityFrameworkCore.SqlServer 7.0.5(最新)
您将需要使用非通用DbContext.Set
函数,并使用非泛型IEnumerable
界面
public IEnumerable GetData(Type typeOfTable)
{
return _context.Set(typeOfTable);
}
在 EF Core 中,此函数不可用,因此您需要反射来调用通用函数。
public IEnumerable GetData(Type typeOfTable)
{
var mthd = _context.GetType().GetMethods().FirstOrDefault(m =>
m.Name == "Set" && m.GetParameters().Length == 0);
var genericMthd = mthd.MakeGenericMethod(typeOfTable);
return (IEnumerable)genericMthd.Invoke(_context, null);
}
然后您需要将其传递到 CSV 函数中。
它没有正确处理写入器的刷新。这是更正后的代码,请注意,编写器已完全处理,但设置为保持流打开。
public byte[] ExportToCsv(IEnumerable data)
{
using var memoryStream = new MemoryStream();
using (var streamWriter = new StreamWriter(memoryStream, leaveOpen: true))
using (var csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture, leaveOpen: true))
{
csvWriter.WriteRecords(data);
}
return memoryStream.ToArray();
}
请注意,使用ToArray
效率低下:理想情况下,您只需倒带流并将其传回,而不是新的byte[]
大批。如果您打算最终将其写入文件或网络响应,则更是如此。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)