Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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# 将Web服务中的数据表写入XML的最佳方法?_C#_.net_Xml_Linq_Datatable - Fatal编程技术网

C# 将Web服务中的数据表写入XML的最佳方法?

C# 将Web服务中的数据表写入XML的最佳方法?,c#,.net,xml,linq,datatable,C#,.net,Xml,Linq,Datatable,我试图重构一些运行缓慢的代码,这些代码使用多个数据表的嵌套循环编写XML。我读到使用linq编写xml会更快。我不太精通linq,所以我希望在这里得到一些帮助 我需要提到的一些事情是,当前的体系结构使用了一个webservice,它在dataTables中向我们返回数据。然后我们(迭代地)遍历数据表,结果是几个嵌套循环 例如: dt1 = Webservice.getStuff(); for each (datarow r1 in dt1.Rows) { dt2 = Webservic

我试图重构一些运行缓慢的代码,这些代码使用多个数据表的嵌套循环编写XML。我读到使用linq编写xml会更快。我不太精通linq,所以我希望在这里得到一些帮助

我需要提到的一些事情是,当前的体系结构使用了一个webservice,它在dataTables中向我们返回数据。然后我们(迭代地)遍历数据表,结果是几个嵌套循环

例如:

dt1 = Webservice.getStuff();

for each (datarow r1 in dt1.Rows) {

   dt2 = Webservice.getMoreStuff(r1[col1], r1[col2]);
   // write out some xml

   for each (datarow r2 in dt2.Rows) {

       dt3 = Webservice.getEvenMoreStuff(r2[col1], r2[col2]);
       // write out more xml 

       for each (datarow r3 in dt3.Rows) {
            // write out more xml 
       }

   }
}
正如你所看到的,这是非常缓慢的。有没有一种方法可以使用linq加快速度?你们有什么建议可以作为更有效的重构方法?如果细节不清楚,我很抱歉


我感谢任何人提供的任何帮助。

在这种情况下,编写XML并不是让您慢下来的原因。与进行所有web服务调用所花费的时间相比,这种速度应该可以忽略不计


我不想把重点放在XML的编写上,而是想弄清楚如何压缩web服务调用的数量,这样您就可以一次获取所有数据,而不是像那样进行嵌套调用

如果要使用Linq2Xml,还需要Linq2Xml数据集

这样,您就可以将嵌套for循环更改为Linq查询并选择为XML


不过,我确实希望使用XmlWriter会更快,而且肯定会使用更少的内存。但这将是一个多一点的工作写。

我恐怕没有治愈你的需要。因为我很确定,使这种方法变慢的不是如何写出xml,而是获取数据的方式。如果在编写xml方面有任何改进的话,它的比例将不会很明显。我建议您修改获取数据的方式。尽量减少Web服务调用的次数。

听起来你需要首先评测你的应用程序-也许免费试用或类似的服务对你有用。

使用linq to xml和linq to Data Set,你可以创建自己的xml,如下所示:

  static void Main(string[] args)
  {

      DataTable t = getStuff("test");

      var xml = new XElement("Main", from row in t.AsEnumerable()
                select new XElement("firstlevel",
                    new XAttribute("a", row["a"]),
                    new XAttribute("b", row["b"]),
                    from row2 in getStuff(row["a"].ToString()).AsEnumerable()
                    select new XElement("secondlevel",
                       new XAttribute("a", row2["a"]),
                       new XAttribute("b", row2["b"]),
                       from row3 in getStuff(row2["a"].ToString()).AsEnumerable()
                       select new XElement("thirdlevel",
                           new XElement("a", row3["a"]),
                           new XElement("b", row3["b"])))));

      Console.WriteLine(xml.ToString());


  }

  private static DataTable getStuff(string s)
  {
      Random r=new Random(s.GetHashCode());
      DataTable t = new DataTable();
      t.Columns.Add("a");
      t.Columns.Add("b");
      for (int i = 0; i < 2; i++)
      {
          t.Rows.Add (r.Next().ToString(), r.Next().ToString());
      }
      return t;
  }
static void Main(字符串[]args)
{
数据表t=getStuff(“测试”);
var xml=new-XElement(“Main”,来自t.AsEnumerable()中的行)
选择新元素(“第一级”,
新的X属性(“a”,第[“a”行]),
新的X属性(“b”,第[“b”行]),
从getStuff中的第2行(第[“a”].ToString()行)开始。AsEnumerable()
选择新元素(“第二级”,
新的X属性(“a”,第2行[“a”),
新的X属性(“b”,第2行[“b”),
从getStuff(第2行[“a”].ToString()).AsEnumerable()中的第3行开始
选择新的元素(“第三级”,
新元素(“a”,第3行[“a”),
新的XElement(“b”,第3行[“b”];));
WriteLine(xml.ToString());
}
私有静态数据表getStuff(字符串s)
{
Random r=新的Random(s.GetHashCode());
DataTable t=新的DataTable();
t、 列。添加(“a”);
t、 列。添加(“b”);
对于(int i=0;i<2;i++)
{
t、 添加(r.Next().ToString(),r.Next().ToString());
}
返回t;
}

您必须重新考虑解决方案,以消除所有循环WS调用。这是一个严重的性能问题。

您没有说明如何编写XML或将XML写入何处

如果您正在写入字符串。停下来,写一个流

如果要写入缓冲字符串,请查看缓冲区的大小。如果您是从ASP.NET页面或处理程序进行写入,请定期调用Response.Flush()

这里有一个平衡点,因为写入缓冲区几乎总是比写入流快。但是,写入自动调整大小的缓冲区的速度会越慢,需要调整的缓冲区越大。更重要的是,任何正在处理XML的东西都不能开始工作,直到它开始接收到一些数据,这在第一次刷新之后才会发生


因此,这里可能有改进的余地,尽管对Web服务的调用可能会超过可以获得的收益。如果您重写对Web服务响应的解析,使其
在解析时生成
项,这意味着您可以在接收到整个响应之前开始处理响应,那么这可能也会有所改进。

这里缓慢的部分似乎是对Web服务的调用,而不是XML编写部分。WebService有一个缓慢的、高延迟的环=)只是一个想法:给定当前的代码片段,没有关于如何创建XML的详细信息,加上可能有大量的数据通过网络发送,太多的服务器调用,以及客户端数据表的填充-所有这些都可能导致性能下降;因此,没有明显的理由认为XML编写是一个瓶颈。您是否可以重写或添加另一个getStuff方法来提供完整的结果,而不是嵌套webservice调用?是否可以重写webservice以返回更大的结果集,其中包含dt1所需的所有数据,dt2和dt3-这可能是您最好的性能提升您做过任何评测吗?我想知道web服务调用在没有任何XML编写的情况下自己需要多长时间——您可能会发现它们是您延迟的98%,如果没有修改它们的空间,您最多只能将性能提高2%。任何类型的大循环中的web服务调用都让我感到害怕是的,我同意一个严重的问题是web服务调用,但问题是,我无法控制Web服务,我需要从前面的每次调用中获取信息,以便调用后续的Web服务方法。@Johnny:但是,要求“最快写入”并没有多大用处。@JohnnyQuest-在这种情况下,我的观点是,优化XML编写是毫无意义的。你真的不会在性能上看到任何好处(如果你担心的话)