public IHttpActionResult Search(decimal?minPrice, decimal?maxPrice, string cardName, string setName, string colorName)
        {
            var repo = CardInfoRepositoryFactory.GetRepository();

            try
            {
                var parameters = new CardInfoSearchParameters()
                {
                    MinPrice  = minPrice,
                    MaxPrice  = maxPrice,
                    CardName  = cardName,
                    SetName   = setName,
                    ColorName = colorName
                };
                var result = repo.Search(parameters);
                return(Ok(result));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex.Message));
            }
        }
        public IEnumerable <CardLongItem> Search(CardInfoSearchParameters parameters)
        {
            List <CardLongItem> cardInfo = new List <CardLongItem>();

            using (var cn = new SqlConnection(Settings.GetConnectionString()))
            {
                string query = "CREATE TABLE #Temp (CardID int, ColorName varchar(50)) INSERT INTO #Temp SELECT i.CardId, c.ColorName FROM CardInfo i " +
                               "JOIN CardColors cc ON cc.CardId = i.CardId JOIN Colors c ON c.ColorId = cc.ColorId CREATE TABLE #ColorString(CardID int, ColorName varchar(50)) " +
                               "INSERT INTO #ColorString Select Main.CardID, Left(Main.Colors, Len(Main.Colors) - 1) As 'Students' From(Select distinct T2.CardId," +
                               "(Select T1.ColorName + ', ' AS[text()] From #Temp T1 Where T1.CardId = T2.CardID ORDER BY T1.CardID For XML PATH(''))[Colors] From #Temp T2)" +
                               " [Main] SELECT DISTINCT CardInfo.CardId, CardName, CmcAmount, CardArtURL, ArtistName, CardNumber, MSRP, SalePrice, SetName, TypeName, #ColorString.ColorName, CardText," +
                               " [Power], Toughness FROM CardInfo INNER JOIN CardSet ON CardInfo.CardId = CardSet.CardId INNER JOIN[Set] ON CardSet.SetId = [Set].SetId " +
                               "INNER JOIN CMC ON CardInfo.CmcId = CMC.CmcId INNER JOIN Artist ON CardInfo.ArtistId = Artist.ArtistId INNER JOIN CardType ON " +
                               "CardInfo.CardId = CardType.CardId INNER JOIN[Type] ON CardType.TypeId = [Type].TypeId INNER JOIN CardColors ON CardInfo.CardId = " +
                               "CardColors.CardId INNER JOIN Colors ON CardColors.ColorId = Colors.ColorId INNER JOIN #ColorString ON CardInfo.CardId = #ColorString.CardID WHERE 1 = 1 ";
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = cn;

                if (parameters.MinPrice.HasValue)
                {
                    query += "AND SalePrice >= @MinPrice ";
                    cmd.Parameters.AddWithValue("@MinPrice", parameters.MinPrice.Value);
                }

                if (parameters.MaxPrice.HasValue)
                {
                    query += "AND SalePrice <= @MaxPrice ";
                    cmd.Parameters.AddWithValue("@MaxPrice", parameters.MaxPrice.Value);
                }

                if (!string.IsNullOrEmpty(parameters.CardName))
                {
                    query += "AND CardName LIKE @CardName ";
                    cmd.Parameters.AddWithValue("@CardName", '%' + parameters.CardName + '%');
                }

                if (!string.IsNullOrEmpty(parameters.SetName))
                {
                    query += "AND SetName LIKE @SetName ";
                    cmd.Parameters.AddWithValue("@SetName", parameters.SetName + '%');
                }

                if (!string.IsNullOrEmpty(parameters.ColorName))
                {
                    query += "AND #ColorString.ColorName LIKE @ColorName ";
                    cmd.Parameters.AddWithValue("@ColorName", '%' + parameters.ColorName + '%');
                }

                query += "ORDER BY MSRP DESC";

                cmd.CommandText = query;

                cn.Open();

                using (SqlDataReader dr = cmd.ExecuteReader())
                {
                    while (dr.Read())
                    {
                        CardLongItem row = new CardLongItem();
                        row.CardId     = (int)dr["CardId"];
                        row.CardName   = dr["CardName"].ToString();
                        row.CmcAmount  = dr["CmcAmount"].ToString();
                        row.CardArtURL = dr["CardArtURL"].ToString();
                        row.ArtistName = dr["ArtistName"].ToString();
                        row.CardNumber = dr["CardNumber"].ToString();
                        row.MSRP       = (int)dr["MSRP"];
                        row.SalePrice  = (int)dr["SalePrice"];
                        row.SetName    = dr["SetName"].ToString();
                        row.TypeName   = dr["TypeName"].ToString();
                        row.ColorName  = dr["ColorName"].ToString();

                        if (dr["CardText"] != DBNull.Value)
                        {
                            row.CardText = dr["CardText"].ToString();
                        }

                        if (dr["Power"] != DBNull.Value)
                        {
                            row.Power = (int)dr["Power"];
                        }

                        if (dr["Toughness"] != DBNull.Value)
                        {
                            row.Toughness = (int)dr["Toughness"];
                        }

                        cardInfo.Add(row);
                    }
                }
            }

            return(cardInfo);
        }