繁体   English   中英

.Net的实体框架

[英].Net Entity Framework to CSV

我正在使用最新的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;
    }

查看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类( http://msdn.microsoft.com/en-us/library/system.text.stringbuilder.aspx

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

而是创建一个stringbuilder对象:

StringBuilder builder = new StringBuilder();

builder.Append("my data");

最后,只需打电话

builder.ToString();

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

这是代码答案:

    /// <summary>
    /// Quotes a string using the following rules:
    /// <list>
    /// <listheader>Rules</listheader>
    /// <item>if the string is not quoted and the string contains the separator string</item>
    /// <item>if the string is not quoted and the string begins or ends with a space</item>
    /// <item>if the string is not quoted and the string contains CrLf</item>
    /// </list>
    /// </summary>
    /// <param name="s">String to be quoted</param>
    /// <param name="quote">
    /// <list>
    /// <listheader>quote characters</listheader>
    /// <item>if len = 0 then double quotes assumed</item>
    /// <item>if len = 1 then quote string is doubled for left and right quote characters</item>
    /// <item>else first character is left quote, second character is right quote</item>
    /// </list>
    /// </param>
    /// <param name="sep">separator string to check against</param>
    /// <returns></returns>
    /// <remarks></remarks>
    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<int>().
                Select(ii => props[ii].Name.QuoteName("[]")).ToArray()));

            foreach (var dr in entity)
            {
                sb.AppendLine();
                sb.Append(string.Join(",", Enumerable.Range(0, iCols).Cast<int>().
                    Select(ii => props[ii].GetValue(dr).
                        ToString().QuoteName("\"\"", ",")).ToArray()));
            }
        }
        catch (Exception ex)
        {

            throw;
        }
        return sb.ToString();
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM