我使用的是最新的带有DBContext的Entity Framework。我有一个结果集,我想转换为逗号分隔的值。我在VB DataTable to CSV extraction中对DataTables做了类似的操作。我已经得到了QuoteName方法的工作。我还使用foreach得到了GetCSV方法的一个派生。问题是它比DataTable的类似代码慢得多。所以我希望有人能给我一些建议。
public static string GetCSV(this IQueryable entity)
{
if (entity == null)
{
throw new ArgumentNullException("entity");
}
Type T = entity.ElementType;
var props = T.GetProperties(BindingFlags.Public | BindingFlags.Instance);
string s = string.Empty;
int iCols = props.Count();
try
{
s += string.Join(",", (from int ii in Enumerable.Range(0, iCols)
select props[ii].Name.QuoteName("[]")).ToArray());
s += Environment.NewLine;
foreach (var dr in entity)
{
s += string.Join(",", (from int ii in Enumerable.Range(0, iCols)
select
props[ii].GetValue(dr)
.ToString()
.QuoteName("\"\"", ",")).ToArray());
s += Environment.NewLine;
}
s = s.TrimEnd(new char[] { (char)0x0A, (char)0x0D });
}
catch (Exception)
{
throw;
}
return s;
}
3条答案
按热度按时间elcex8rz1#
查看nuget包CsvHelper(http://nuget.org/packages/CsvHelper/)。
下面是https://github.com/JoshClose/CsvHelper/wiki/Basics的用法示例
hk8txs482#
不要使用字符串来创建文件。尝试使用StringBuilder类(http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx)
字符串是不可变的对象--也就是说,一旦创建了字符串,就不能更改它。每次你改变一个字符串(比如连接它),你实际上是在创建一个全新的字符串。在这里使用字符串是非常低效的。
相反,创建一个stringbuilder对象:
最后,只要打电话
ql3eal8s3#
我得到了我弟弟的帮助。他说也要使用StringBuilder。
这是代码答案:
我希望这对其他人有帮助。