public static string SqlIdIn(this ConnectionManagerType type, IEnumerable <string> idColumnNames, IEnumerable <IEnumerable <object> > ids, string tableName = null)
        {
            if (ids is null)
            {
                throw new ArgumentNullException(nameof(ids));
            }
            string result;
            int    columnCount = idColumnNames.Count();

            // simple in
            if (columnCount == 1)
            {
                string id     = type.ColumnName(idColumnNames.Single(), tableName: tableName);
                string values = Sql.ToString(ids.SelectMany(i => i));
                result = $"{id} in ({values})";
            }
            // tuples
            else if (type.SupportsTuples())
            {
                string columns = type.JoinColumnNames(idColumnNames, tableName: tableName);
                ValidateId(columns, idColumnNames);
                string values = Sql.ToString(ids.Select(id => Sql.AddBraces(Sql.ToString(id))));
                ValidateIds(values, ids);
                result = $"({columns}) in ({values})";
            }
            // and/or
            else
            {
                ValidateId(type.JoinColumnNames(idColumnNames), idColumnNames);
                idColumnNames = type.ColumnNames(idColumnNames, tableName: tableName).ToArray();
                result        = Sql.ToString(
                    ids.Select(id =>
                               Sql.ToString(
                                   idColumnNames.Zip(id, (name, value) => (name, value)),
                                   itemDelimiter: Sql.AndDelimiter)),
                    Sql.OrDelimiter);
                ValidateIds(result, ids);
            }
            return(result);
        }