.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(); } }
我希望这对其他人有帮助。