C# c concate从大型listarray转换为字符串

C# c concate从大型listarray转换为字符串,c#,optimization,sql-server-2008-r2,concatenation,C#,Optimization,Sql Server 2008 R2,Concatenation,我有一个具有以下结构的listArray: listArray[0] insert_idlist = listArray (value, value, value, ect) 此数组在每个维度中包含大约2000个值 var string_list = "'" + string.Join("', '", insert_idlist[0]) + "'"; //var string_list = "'0169624'"; 出于db查询的目的,我正试图将第一个维度合并成一个字符串,如上所述。但是,在

我有一个具有以下结构的listArray:

listArray[0] insert_idlist = listArray (value, value, value, ect)
此数组在每个维度中包含大约2000个值

var string_list = "'" + string.Join("', '", insert_idlist[0]) + "'";
//var string_list = "'0169624'";
出于db查询的目的,我正试图将第一个维度合并成一个字符串,如上所述。但是,在部署时,这会导致程序挂起,根据以前在部署环境中的经验,我怀疑大量的值是导致挂起的原因

当启用注释行时,代码将按预期运行

有人能推荐一种可提供性能改进的concating替代方法吗?

我认为您可以使用表值参数将列表传递给DB

这将通过一开始就没有连接来解决连接问题

表值参数提供了封送多行的简单方法 将数据从客户端应用程序复制到SQL Server,而无需 用于处理数据的多个往返或特殊服务器端逻辑 数据可以使用表值参数封装数据行 在客户端应用程序中,并将数据以单一方式发送到服务器 参数化命令。传入的数据行存储在表中 然后可以使用Transact-SQL对其进行操作的变量

首先在MSDN上阅读此内容。

作为参数传递

using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
        {
        //
        // Add new SqlParameter to the command.
        //
        command.Parameters.Add(new SqlParameter("Name", dogName));          
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            int weight = reader.GetInt32(0);
            string name = reader.GetString(1);
            string breed = reader.GetString(2);
            Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight,name,breed);
        }
        }
您可以尝试使用“capacity”构造函数参数预先分配足够的空间。这样,在构建目标字符串时,就不必一次又一次地将字符串复制到更长的缓冲区中。 然后使用foreach语句或类似语句进行连接


这可能会更快,也可能不会更快,这取决于“string.Join”是如何在内部实现的,这在不同版本的.NET framework中可能会有所不同。

如果您希望以牺牲可读性为代价来提高性能,那么在循环中使用StringBuilder应该比避免使用foreach更快

看看:


别猜了。分析并找出实际的瓶颈。你可能对原因是对的,但很可能你错了。@Oded我花了一上午的大部分时间来研究这个问题。这肯定是原因。你做过时间测量吗?连接需要多长时间?你确定连接而不是db查询本身是一个瓶颈吗?@默认语言环境我很确定,考虑到我们对部署环境的访问级别,这是不可能的。那么使用与生产环境类似的设置进行本地测试呢?你需要检查时间花在哪里。是连接吗?网络IO?服务器?这假定SQL server 2005+是的,确实如此。它还假设OP希望将元素列表传递给db query。@所有这些都可以。sql server是2008r2@Jakub你能解释一下吗?我不太熟悉表值参数show您知道这些不是作为参数传入的吗?即使不是这样,为什么这样做会更快呢?当然,它可以防止SQL注入。这和这个问题有什么关系?