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); }