Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何更改CSVHelper中字段和字段名称的顺序_C#_Asp.net_Asp.net Mvc_Entity Framework_Csvhelper - Fatal编程技术网

C# 如何更改CSVHelper中字段和字段名称的顺序

C# 如何更改CSVHelper中字段和字段名称的顺序,c#,asp.net,asp.net-mvc,entity-framework,csvhelper,C#,Asp.net,Asp.net Mvc,Entity Framework,Csvhelper,我正在使用asp.net mvc 4 web应用程序+实体框架5.0,我使用以下方法调用名为AdvanceSearchStoredProcess的函数,该函数将调用存储过程:- public IQueryable<AdvanceSearchSP_Result> AdvanceSearch(NetworkAdvanceSearch na) { var r = entities.AdvanceSearchStoredProcedure("netwo

我正在使用asp.net mvc 4 web应用程序+实体框架5.0,我使用以下方法调用名为
AdvanceSearchStoredProcess
的函数,该函数将调用存储过程:-

     public IQueryable<AdvanceSearchSP_Result> AdvanceSearch(NetworkAdvanceSearch na)
      {

        var r = entities.AdvanceSearchStoredProcedure("network",na.AssetTypeID,
        na.ip, na.ipselection, na.mac, na.macselection);
        return r.AsQueryable();           

      }
现在,我在生成的
.CSV
文件中面临以下问题:-

  • 字段标题将等于数据库中的列名,而不是
    AdvanceSearchSP\u Result\u Validation
    MetadataType类中的定义

  • 第二个问题,我不确定如何更改列的顺序?目前,顺序将与存储过程中定义的顺序相同。例如,我如何强制
    ismanaged
    成为.csv文件中的第一列

  • 我正在使用CSVHelper库进行实际的CSV导出

    编辑 现在我添加了这个类:-

    public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
        {
            public SPMap()
        {
            Map(m => m.Tag).Name("Resource Tag").Index(0);
            Map(m => m.RESOURCENAME).Name("Asset Name").Index(1);
            Map(m => m.cusotmername).Name("Customer Name").Index(2);
            Map(m => m.sitename).Name("Site Name").Index(3);
            Map(m => m.StateName).Name("Asset State").Index(4);
            Map(m => m.ismanaged).Name("ismanaged").Index(5);
            Map(m => m.TypeName).Name("Technology Type ").Index(6);
            Map(m => m.SERVICETAG).Name("Service Tag").Index(7);
            Map(m => m.SERIALNO).Name("Serial Number").Index(8);
    
        }
        }
    
    公共密封类SPMap:ClassMap
    {
    公共SPMap()
    {
    Map(m=>m.Tag).Name(“资源标签”).Index(0);
    Map(m=>m.RESOURCENAME).Name(“资产名称”).Index(1);
    Map(m=>m.cusotmername).Name(“客户名称”).Index(2);
    地图(m=>m.sitename).Name(“sitename”).Index(3);
    Map(m=>m.StateName).Name(“资产状态”).Index(4);
    Map(m=>m.ismanaged).Name(“ismanaged”).Index(5);
    Map(m=>m.TypeName).Name(“技术类型”).Index(6);
    Map(m=>m.SERVICETAG).Name(“SERVICETAG”).Index(7);
    Map(m=>m.SERIALNO).名称(“序列号”).索引(8);
    }
    }
    
    然后,我修改我的方法以包括以下配置:-

    public ActionResult AdvanceSearchIndexExport(AdvanceSearchSP_Result2 ns)
    
            {
                var result = WriteCsvToMemory(repository.AdvanceSearch(ns.NetwotkAS).ToList());
                var memoryStream = new MemoryStream(result);
                return new FileStreamResult(memoryStream, "text/csv") { FileDownloadName = "export.csv" };
            }
    public byte[] WriteCsvToMemory(IEnumerable<AdvanceSearchSP_Result> records)
          {
              using (var memoryStream = new MemoryStream())
              using (var streamWriter = new StreamWriter(memoryStream))
              using (var csvWriter = new CsvWriter(streamWriter))
              {
                  csvWriter.WriteRecords(records);
                  streamWriter.Flush();
                  return memoryStream.ToArray();
              }
          }
    
     public byte[] WriteCsvToMemory(IEnumerable<AdvanceSearchSP_Result> records)
          {
              using (var memoryStream = new MemoryStream())
              using (var streamWriter = new StreamWriter(memoryStream))
              using (var csvWriter = new CsvWriter(streamWriter))
              {
                  csvWriter.WriteRecords(records);
                  csvWriter.Configuration.RegisterClassMap<SPMap>();
                  streamWriter.Flush();
                  return memoryStream.ToArray();
              }
          }
    
    public byte[]写入内存(IEnumerable记录)
    {
    使用(var memoryStream=new memoryStream())
    使用(var streamWriter=新streamWriter(memoryStream))
    使用(var csvWriter=新的csvWriter(streamWriter))
    {
    CSV编写者编写记录(记录);
    csvWriter.Configuration.RegisterClassMap();
    streamWriter.Flush();
    返回memoryStream.ToArray();
    }
    }
    

    但我还是得到了旧名字和旧秩序。。因此,
    公共密封类SPMap:ClassMap
    似乎没有任何效果…

    我认为您需要一个映射来指定列的名称和索引:

    public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
    {
        public SPMap()
        {
            Map(m => m.SERVICETAG).Name("Service Tag").Index(0);
            Map(m => m.sitename).Name("Site Name").Index(1);
            /*repeat for other properties */
            ..
            .. 
        }
    }
    
    公共密封类SPMap:ClassMap

    公共字节[]WriteItem(列表集合),其中T:class
    {
    类型t=类型(t);
    字符串换行符=Environment.newLine;
    object obj=Activator.CreateInstance(t);
    PropertyInfo[]props=obj.GetType().GetProperties();
    byte[]carineReturnBytes=System.Text.Encoding.UTF8.GetBytes(“\r”);
    字符串文本;
    使用(MemoryStream ms=new MemoryStream())
    使用(StreamReader sr=新StreamReader(ms))
    {
    foreach(道具中的属性信息pi)
    {
    byte[]data=System.Text.Encoding.UTF8.GetBytes(pi.Name.ToString()+“,”);
    ms.Write(数据,0,数据长度);
    }
    ms.Write(carineReturnBytes,0,carineReturnBytes.Length);
    foreach(集合中的T项)
    {
    foreach(道具中的属性信息pi)
    {
    字符串写入=
    Convert.ToString(item.GetType().GetProperty(pi.Name).GetValue(item,null)).Replace(“,”,“)+”,”;
    byte[]data=System.Text.Encoding.UTF8.GetBytes(write);
    ms.Write(数据,0,数据长度);
    }
    byte[]writeNewLine=System.Text.Encoding.UTF8.GetBytes(Environment.NewLine);
    ms.Write(writeNewLine,0,writeNewLine.Length);
    }
    ms.Position=0;
    text=sr.ReadToEnd();
    返回ToArray女士();
    }
    }
    
    但是我需要在哪里注册这个
    csvWriter.Configuration.RegisterClassMap()??在global.asax内部?当我需要注册这个
    csvWriter.Configuration.RegisterClassMap()时,你能给我一些建议吗??在我的行动方法里?我试过你的方法。。但是它不起作用。。你能检查我的编辑吗?@johnG Move
    csvWriter.Configuration.RegisterClassMap()代码中的一行。@johnG如上所述,您需要在写入csv文件之前注册映射,因此将注册行向上移动到写入行之上,然后它就可以工作了。我没有尝试过这个方法,但是如果你按照我在答案中的链接进行操作,它会在那里详细说明。你能检查我对原始问题的编辑吗?你尝试过上述方法吗?通过更改属性的顺序,你应该能够更改csv顺序。如果您仍然面临问题,请告诉我
    
    public sealed class SPMap : ClassMap<AdvanceSearchSP_Result>
    {
        public SPMap()
        {
            Map(m => m.SERVICETAG).Name("Service Tag").Index(0);
            Map(m => m.sitename).Name("Site Name").Index(1);
            /*repeat for other properties */
            ..
            .. 
        }
    }
    
    csvWriter.Configuration.RegisterClassMap<SPMap>();
    
    public byte[] WriteItem<T>(List<T> collection) where T : class
            {
    
    
                Type t = typeof(T);
                string newLine = Environment.NewLine;
    
                object obj = Activator.CreateInstance(t);
                PropertyInfo[] props = obj.GetType().GetProperties();
                byte[] carriageReturnBytes = System.Text.Encoding.UTF8.GetBytes("\r");
    
                string text;
                using (MemoryStream ms = new MemoryStream())
                using (StreamReader sr = new StreamReader(ms))
                {
                    foreach (PropertyInfo pi in props)
                    {
                        byte[] data = System.Text.Encoding.UTF8.GetBytes(pi.Name.ToString() + ",");
                        ms.Write(data, 0, data.Length);
                    }
    
                    ms.Write(carriageReturnBytes, 0, carriageReturnBytes.Length);
    
                    foreach (T item in collection)
                    {
                        foreach (PropertyInfo pi in props)
                        {
                            string write =
                               Convert.ToString(item.GetType().GetProperty(pi.Name).GetValue(item, null)).Replace(",", " ") + ',';
    
                            byte[] data = System.Text.Encoding.UTF8.GetBytes(write);
                            ms.Write(data, 0, data.Length);
                        }
    
                        byte[] writeNewLine = System.Text.Encoding.UTF8.GetBytes(Environment.NewLine);
                        ms.Write(writeNewLine, 0, writeNewLine.Length);
                    }
    
                    ms.Position = 0;
                    text = sr.ReadToEnd();
                    return ms.ToArray();
                }
            }