使用LINQ将SQL表转换为CSV

j2qf4p5b  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(59)

我正在尝试将一个表放入逗号分隔的CSV文件中。我目前是这样实现的:

var csv = new StringBuilder("id,Name,Address,City,State\n");
var delimiter = ",";
var newline = "\n";

using (var db = MyDatabase())
{
     var query = from c in db.Customers select c;
     foreach(var q in query)
         csv.Append(q.id).Append(delimiter)
             .Append(q.name).Append(delimiter)
             .Append(q.address).Append(delimiter)
             .Append(q.city).Append(delimiter)
             .Append(q.state).Append(newline);
}

字符串
这就创建了一个csv fine。但我的问题是,有没有一种更精简的方法可以实现这一点,而不需要单独指定每一列?在某些情况下,我想做一个select all**,但由于表中有很多列,这似乎有点笨拙。

qlckcl4x

qlckcl4x1#

为了在不指定要写入CSV的每个属性的情况下做到这一点,您需要使用反射。下面是如何做到这一点的基本示例:

List<Customer> query = from c in db.Customers select c;
        foreach (var q in query)
        {
            Type type = typeof(Customer);
            PropertyInfo[] properties = type.GetProperties();
            foreach (PropertyInfo property in properties)
            {
                string value = property.GetValue(type, null) != null
                    ? property.GetValue(type, null).ToString() 
                    : string.Empty; // or whatever you want the default text to be
                csv.Append(q.id).Append(delimiter);
            }
        }

字符串
这将遍历查询中的每个Customer,然后遍历Customer中的每个属性并写入值。这是假设您希望将Customer中的每个属性写入CSV文件。这至少应该给予您关于如何完成您想要完成的任务的想法。

41ik7eoe

41ik7eoe2#

你想要达到的最短路径可能是:

var props = typeof(Customer).GetProperties(
          BindingFlags.Instance|BindingFlags.Public
      );

StringBuilder result = new StringBuilder(
         (
             from prop in props select prop.Name
         ).Join(',') + "\n"
     );

Function<string,Customer> project = ( 
   Customer c => (
           from prop in props 
           select prop.GetValue(c).ToString()
       ).Join(",")+"\n";
)

using (var db = MyDatabase())
{
    var query = from c in db.Customers select project(c);
    foreach (var res in query) {
        result.append(res);
    }
}

字符串
您可以很容易地使其更通用,但随后您将需要缓存反射的PropertyInfo,以避免在类型上大量使用反射。

警告:你应该正确地转义属性值,因为换行符,逗号,引号等会破坏你的CSV文件。更好的是,使用一个已经解决了编写正确CSV文件问题的库。

5q4ezhmt

5q4ezhmt3#

我使用这个代码:

string delimiter = "|";
string newLine = Environment.NewLine;

using (mCustDataContext = new CustDataContext()) {
    var props = typeof(Customer).GetProperties();

    StringBuilder headers = new StringBuilder(string.Join(delimiter, props.Select(c => c.Name).ToArray()) + newLine);

    Func<Customer, string> myFunc = c => 
         string.Join(delimiter, props.Select(b => b.GetValue(c,null))) + newLine;

    var query = mCustDataContext.Customers.Select(myFunc);

    foreach(var q in query)
        headers.Append(q);

    File.WriteAllText(yourFileName, headers.ToString(), mEncoding);
}

字符串

kfgdxczn

kfgdxczn4#

不依赖于特定表格格式的代码:

await conn.OpenAsync(token).ConfigureAwait(false);

const string Sql = "SELECT * FROM table_name;";

DataTable dataTable = new DataTable();        
using var command = new SqlCommand(Sql, conn);        
using var reader = await command.ExecuteReaderAsync(token);        
dataTable.Load(reader);

var columns = dataTable.Columns.Cast<DataColumn>()
    .Select(c => c.ColumnName);        
var results = dataTable.Rows.Cast<DataRow>()
    .Select(row => columns.ToDictionary(column => column, column => row[column]));        
var head_str = string.Join(";", columns.Values)));        
var result_str = string.Join("\r\n", results.Select(t => string.Join(";", t.Values)));

字符串

相关问题