.Net的entity framework

我正在使用最新的Entity Framework和DBContext。 我有一个结果集,我想转换为逗号分隔值。 我在VB DataTable中使用DataTables做了类似的事情来进行CSV提取 。 我有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; } 

不要使用字符串来创建文件。 尝试使用StringBuilder类( http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

字符串是不可变对象 – 也就是说,一旦创建了字符串,就无法更改它。 每次更改字符串(例如连接它)时,您实际上都在创建一个全新的字符串。 在这里使用字符串是非常低效的。

相反,创建一个stringbuilder对象:

 StringBuilder builder = new StringBuilder(); builder.Append("my data"); 

最后,只需打电话

 builder.ToString(); 

查看nuget包CsvHelper( http://nuget.org/packages/CsvHelper/ )。

以下是https://github.com/JoshClose/CsvHelper/wiki/Basics的用法示例

 using (var csv = new CsvWriter( new StreamWriter( "Actors.csv" ) )) { csv.WriteRecords( actorsList ); } 

我得到了我弟弟的帮助。 他说也使用StringBuilder。

这是代码答案:

  ///  /// Quotes a string using the following rules: ///  /// Rules /// if the string is not quoted and the string contains the separator string /// if the string is not quoted and the string begins or ends with a space /// if the string is not quoted and the string contains CrLf ///  ///  /// String to be quoted ///  ///  /// quote characters /// if len = 0 then double quotes assumed /// if len = 1 then quote string is doubled for left and right quote characters /// else first character is left quote, second character is right quote ///  ///  /// separator string to check against ///  ///  public static string QuoteName(this string s, string quote = null, string sep = ",") { quote = quote == null ? "" : quote; switch (quote.Length) { case 0: quote = "\"\""; break; case 1: quote += quote; break; } // Fields with embedded sep are quoted if ((!s.StartsWith(quote.Substring(0, 1))) && (!s.EndsWith(quote.Substring(1, 1)))) if (s.Contains(sep)) s = quote.Substring(0, 1) + s + quote.Substring(1, 1); // Fields with leading or trailing blanks are quoted if ((!s.StartsWith(quote.Substring(0, 1))) && (!s.EndsWith(quote.Substring(1, 1)))) if (s.StartsWith(" ") || s.EndsWith(" ")) s = quote.Substring(0, 1) + s + quote.Substring(1, 1); // Fields with embedded CrLF are quoted if ((!s.StartsWith(quote.Substring(0, 1))) && (!s.EndsWith(quote.Substring(1, 1)))) if (s.Contains(System.Environment.NewLine)) s = quote.Substring(0, 1) + s + quote.Substring(1, 1); return s; } 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); var sb = new StringBuilder(); int iCols = props.Count(); try { sb.Append(string.Join(",", Enumerable.Range(0, iCols).Cast(). Select(ii => props[ii].Name.QuoteName("[]")).ToArray())); foreach (var dr in entity) { sb.AppendLine(); sb.Append(string.Join(",", Enumerable.Range(0, iCols).Cast(). Select(ii => props[ii].GetValue(dr). ToString().QuoteName("\"\"", ",")).ToArray())); } } catch (Exception ex) { throw; } return sb.ToString(); } } 

我希望这对其他人有帮助。