簡體   English   中英

Dapper 和 CsvHelper 動態忽略列

[英]Dapper and CsvHelper ignore columns dynamically

我正在使用 Dapper 查詢我不知道返回的列的 SQL 過程。 我想用 CsvHelper 將結果寫入 CSV 文件。 在運行時,我想動態忽略一些列。 CsvHelper 有一個映射配置,它只接受預定義的類。

var records = sqlCon.Query(sqlProcedure); //dynamic columns

using (var writer = new StreamWriter(@"file.csv"))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
    var map = new CsvHelper.Configuration.DefaultClassMap<dynamic>();
...
    csv.Context.RegisterClassMap(map);
    csv.WriteRecords(records);
}

我想不出一種方法來做映射。 可以手動將它們寫出並忽略某些列。

void Main()
{
    dynamic obj1 = new ExpandoObject();
    obj1.Id = 1;
    obj1.Name = "Bill";
    obj1.IgnoreProperty = "Please ignore me";

    dynamic obj2 = new ExpandoObject();
    obj2.Id = 2;
    obj2.Name = "Brenda";
    obj2.IgnoreProperty = "Please also ignore me";
    
    var records = new List<dynamic>
    {
        obj1,
        obj2
    };

    //using (var writer = new StreamWriter("path\\to\\file.csv"))
    using (var csv = new CsvWriter(Console.Out, CultureInfo.InvariantCulture))
    {       
        var recordDictionary = (IDictionary<string, object>)records.First();
        
        var properties = recordDictionary.Keys;
        
        foreach (var property in properties)
        {
            if (property != "IgnoreProperty")
            {
                csv.WriteField(property);
            }               
        }
        
        csv.NextRecord();

        foreach (var record in records)
        {
            var expanded = (IDictionary<string, object>)record;
            
            foreach (var property in properties)
            {
                if (property != "IgnoreProperty")
                {
                    csv.WriteField(expanded[property]);
                }
            }
            
            csv.NextRecord();
        }       
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM