public static Qb ListRids <T>(this List <T> me) where T : IDataObject, new()
        {
            Qb retv = new Qb();

            for (int i = 0; i < me.Count; i++)
            {
                retv.Append($"@{++upseq}_{i}", me[i].RID);
                if (i < me.Count - 1)
                {
                    retv.Append(",");
                }
            }
            return(retv);
        }
        public IQueryBuilder GenerateGetStateChangesQuery(List <Type> workingTypes, Dictionary <Type, MemberInfo[]> fields, DateTime moment)
        {
            var dataLen = fields.Max(f => f.Value.Length);
            Qb  query   = new Qb("");

            workingTypes.ForEachIndexed((type, ti) => {
                var cTimeField = fields[type].FirstOrDefault(f => f.GetCustomAttribute <CreationTimeStampAttribute>() != null);
                var uTimeField = fields[type].FirstOrDefault(f => f.GetCustomAttribute <UpdateTimeStampAttribute>() != null);
                query.Append($"(SELECT \r\n\t'{type.Name}' AS TypeName, ");
                for (int i = 0; i < dataLen; i++)
                {
                    if (fields[type].Length > i)
                    {
                        query.Append($"\r\n\tCAST({fields[type][i].Name} AS BINARY)");
                    }
                    else
                    {
                        query.Append("\r\n\tNULL");
                    }
                    if (ti == 0)
                    {
                        query.Append($"AS data_{i}");
                    }
                    if (i < dataLen - 1)
                    {
                        query.Append(",");
                    }
                }
                query.Append("\r\nFROM");
                query.Append(type.Name);
                if (moment != DateTime.MinValue && (cTimeField != null || uTimeField != null))
                {
                    query.Append("\r\nWHERE");
                    if (cTimeField != null)
                    {
                        query.Append($"{cTimeField.Name} > @m", moment);
                    }
                    if (cTimeField != null && uTimeField != null)
                    {
                        query.Append("OR");
                    }
                    if (uTimeField != null)
                    {
                        query.Append($"{uTimeField.Name} > @m", moment);
                    }
                }
                query.Append(")\r\n");

                if (ti < workingTypes.Count - 1)
                {
                    query.Append("UNION ALL\r\n");
                }
            });

            return(query);
        }