C# 啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。

C# 啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。,c#,sql-server,C#,Sql Server,啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,


啊,数十万。查询的大小没有限制吗?我不确定,但是我可以发送的查询的大小没有限制吗?id是guid,最终每个guid有36个字节。如果我有20000个ID,那么这是一个超过72000字节长的查询。这可能会增长到数十万。查询的大小没有限制吗?这种方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,即可变长度参数需要一个大小。我不确定是将其设置为Guid的大小还是项目数乘以Guid的大小,但当我将其设置为一个相当大的数字时,这似乎很好。最后,“all”是一个关键字,所以我在查询中将其更改为有效标识符,效果非常好。这是一个很好的解决方案。谢谢。@cabird,关于
SqlDbType=SqlDbType.Structured
你说得对。关于长度:你不需要再使用
命令。准备
,正如我在更新的回答中提到的,这个方法非常有效。在使用大量ID时性能也很好(与IN子句不同),这看起来很棒。我正在尝试运行它,但我得到一个异常,它需要显式类型。设置idParam.SqlDbType=SqlDbType.Structured似乎可以解决这个问题。听起来对吗?这导致了一个例外,即可变长度参数需要一个大小。我不确定是将其设置为Guid的大小还是项目数乘以Guid的大小,但当我将其设置为一个相当大的数字时,这似乎很好。最后,“all”是一个关键字,所以我在查询中将其更改为有效标识符,效果非常好。这是一个很好的解决方案。谢谢。@cabird,关于
SqlDbType=SqlDbType.Structured
你说得对。那么关于长度:你不需要使用
命令。正如我在更新的答案中提到的那样,再准备

    private static Dictionary<Guid, string> foo(IEnumerable<Guid> guids, SqlConnection conn)
    {
        using (SqlCommand command = new SqlCommand(null, conn))
        {
            command.CommandText = "select document from Documents where id = @id";
            SqlParameter idParam = new SqlParameter("@id", SqlDbType.UniqueIdentifier);
            command.Parameters.Add(idParam);
            command.Prepare();

            var documents = new Dictionary<Guid, string>();
            foreach (var guid in guids)
            {
                idParam.Value = guid;
                object obj = command.ExecuteScalar();
                if (obj != null)
                {
                    documents[guid] = (string)obj;
                }
            }
            return documents;
        }
    }
CREATE TYPE IdTableType AS TABLE   
( 
    Id uniqueidentifier 
);  
private static Dictionary<Guid, string> foo(IEnumerable<Guid> guids, SqlConnection conn)
{
    using (SqlCommand command = new SqlCommand(null, conn))
    {
        // use parameter as normal table in the query
        command.CommandText = 
            "select document from Documents d inner join @AllIds a ON d.id = a.Id";

        // DataTable is used for Table-Valued parameter as value
        DataTable allIds = new DataTable();
        allIds.Columns.Add("Id"); // Name of column need to be same as in created Type

        foreach(var id in guids)
            allids.Rows.Add(id);

        SqlParameter idParam = new SqlParameter
        {
            ParameterName = "@AllIds",
            SqlDbType=SqlDbType.Structured // Important for table-valued parameters
            TypeName = "IdTableType", // Important! Name of the type must be provided
            Value = allIds
        };
        command.Parameters.Add(idParam);

        var documents = new Dictionary<Guid, string>();
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                documents[guid] = reader[0].ToString();
            }               
        }

        return documents;
    }
}  
connection.Query("select document from Documents where id in @ids", new { ids = guids});