private IList<int> GetCardMedia(int cardid, Side side, WordType? type)
        {
            IList<int> ids = new List<int>();
            IList<IMedia> mediaList = Parent.CurrentUser.Cache[ObjectLifetimeIdentifier.GetIdentifier(CacheObject.CardMedia, cardid)] as IList<IMedia>;
            if (mediaList != null)
            {
                foreach(DbMedia cms in mediaList)
                    if(cms.Side == side && (!type.HasValue || cms.Type == type))
                        ids.Add(cms.Id);

                return ids;
            }

            using (NpgsqlConnection con = PostgreSQLConn.CreateConnection(Parent.CurrentUser))
            {
                using (NpgsqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "SELECT id, media_type,side,type,is_default FROM \"Cards_MediaContent\" JOIN \"MediaContent\" ON media_id=id WHERE cards_id=:cardid;";
                    cmd.Parameters.Add("cardid", cardid);
                    NpgsqlDataReader reader = PostgreSQLConn.ExecuteReader(cmd, Parent.CurrentUser);

                    mediaList = new List<IMedia>();
                    while (reader.Read())
                    {
                        IMedia newMedia = null;
                        int id = Convert.ToInt32(reader["id"]);
                        EMedia mtype = (EMedia)Enum.Parse(typeof(EMedia), Convert.ToString(reader["media_type"]));
                        Side cside = (Side)Enum.Parse(typeof(Side), Convert.ToString(reader["side"]));
                        WordType wordtype = (WordType)Enum.Parse(typeof(WordType), Convert.ToString(reader["type"]));
                        bool isDefault = Convert.ToBoolean(reader["is_default"]);
                        switch (mtype)
                        {
                            case EMedia.Audio:
                                newMedia = new DbAudio(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                                break;
                            case EMedia.Image:
                                newMedia = new DbImage(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                                break;
                            case EMedia.Video:
                                newMedia = new DbVideo(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                                break;
                        }

                        mediaList.Add(newMedia);

                        if ((newMedia as DbMedia).Side == side && (!type.HasValue || (newMedia as DbMedia).Type == type))
                            ids.Add((newMedia as DbMedia).Id);
                    }

                    Parent.CurrentUser.Cache[ObjectLifetimeIdentifier.Create(CacheObject.CardMedia, cardid)] = mediaList;

                    return ids;
                }
            }
        }
        private IList <int> GetCardMedia(int cardid, Side side, WordType?type)
        {
            IList <int>    ids       = new List <int>();
            IList <IMedia> mediaList = Parent.CurrentUser.Cache[ObjectLifetimeIdentifier.GetIdentifier(CacheObject.CardMedia, cardid)] as IList <IMedia>;

            if (mediaList != null)
            {
                foreach (DbMedia cms in mediaList)
                {
                    if (cms.Side == side && (!type.HasValue || cms.Type == type))
                    {
                        ids.Add(cms.Id);
                    }
                }

                return(ids);
            }

            using (NpgsqlConnection con = PostgreSQLConn.CreateConnection(Parent.CurrentUser))
            {
                using (NpgsqlCommand cmd = con.CreateCommand())
                {
                    cmd.CommandText = "SELECT id, media_type,side,type,is_default FROM \"Cards_MediaContent\" JOIN \"MediaContent\" ON media_id=id WHERE cards_id=:cardid;";
                    cmd.Parameters.Add("cardid", cardid);
                    NpgsqlDataReader reader = PostgreSQLConn.ExecuteReader(cmd, Parent.CurrentUser);

                    mediaList = new List <IMedia>();
                    while (reader.Read())
                    {
                        IMedia   newMedia  = null;
                        int      id        = Convert.ToInt32(reader["id"]);
                        EMedia   mtype     = (EMedia)Enum.Parse(typeof(EMedia), Convert.ToString(reader["media_type"]));
                        Side     cside     = (Side)Enum.Parse(typeof(Side), Convert.ToString(reader["side"]));
                        WordType wordtype  = (WordType)Enum.Parse(typeof(WordType), Convert.ToString(reader["type"]));
                        bool     isDefault = Convert.ToBoolean(reader["is_default"]);
                        switch (mtype)
                        {
                        case EMedia.Audio:
                            newMedia = new DbAudio(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                            break;

                        case EMedia.Image:
                            newMedia = new DbImage(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                            break;

                        case EMedia.Video:
                            newMedia = new DbVideo(id, cardid, false, cside, wordtype, isDefault, (wordtype == WordType.Sentence), Parent);
                            break;
                        }

                        mediaList.Add(newMedia);

                        if ((newMedia as DbMedia).Side == side && (!type.HasValue || (newMedia as DbMedia).Type == type))
                        {
                            ids.Add((newMedia as DbMedia).Id);
                        }
                    }

                    Parent.CurrentUser.Cache[ObjectLifetimeIdentifier.Create(CacheObject.CardMedia, cardid)] = mediaList;

                    return(ids);
                }
            }
        }