public static async Task <IEnumerable <IZone> > GetZonesAsync(this SQLiteDatabase database)
        {
            List <IZone> results = new List <IZone>();

            using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM Zones"))
                foreach (DataRow row in await database.GetRowsAsync(cmd))
                {
                    results.Add(await database.CreateZoneFromDataRowAsync(row));
                }

            results.Sort((lhs, rhs) => new NaturalStringComparer().Compare(lhs.Name, rhs.Name));

            return(results);
        }
        // Public members

        public static async Task <IZone> GetZoneAsync(this SQLiteDatabase database, long zoneId, GetZoneOptions options = GetZoneOptions.Default)
        {
            using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM Zones WHERE id = $zone_id")) {
                cmd.Parameters.AddWithValue("$zone_id", zoneId);

                DataRow row = await database.GetRowAsync(cmd);

                if (row != null)
                {
                    return(await database.CreateZoneFromDataRowAsync(row, options));
                }
            }

            return(null);
        }
        public static async Task <IZone> GetZoneAsync(this SQLiteDatabase database, string name, GetZoneOptions options = GetZoneOptions.Default)
        {
            if (string.IsNullOrWhiteSpace(name))
            {
                return(null);
            }

            string fullName = ZoneUtilities.GetFullName(name.Trim()).ToLowerInvariant();

            using (SQLiteCommand cmd = new SQLiteCommand("SELECT * FROM Zones WHERE name = $name OR name = $fullName OR id IN (SELECT zone_id FROM ZoneAliases WHERE alias = $name OR alias = $fullName)")) {
                cmd.Parameters.AddWithValue("$name", name.ToLowerInvariant());
                cmd.Parameters.AddWithValue("$fullName", fullName.ToLowerInvariant());

                DataRow row = await database.GetRowAsync(cmd);

                if (row != null)
                {
                    return(await database.CreateZoneFromDataRowAsync(row, options));
                }
            }

            return(null);
        }