Извлечение данных из базы данных по различным категориям - PullRequest
0 голосов
/ 18 мая 2019

Я настраиваю запрос, который выбирает данные из 3 таблиц на основе фильтров, выбранных пользователем.фильтров может быть несколько или не быть.

Я сделал хранимые процедуры с различной комбинацией.Но я знаю, что это было худшее, что я сделал.

var result =  (from product in context.Products
               from img in context.ProductImage
               from saved in context.SavedProduct
               where (cat.Color.Contains(product.Color)
                & cat.BrandName.Contains(product.Brand_Name)
                & cat.Fabric.Contains(product.Fabric)
                & cat.Design.Contains(product.Design)) 
                select new
                {
                   product.ProductID,
                   product.Price,
                   product.Brand_Name,
                   product.Title,
                   product.Color,
                   product.Fabric,
                   product.Design,
                   img.Image,
                   saved.ProductSavedCounter,
                }).ToList();

Подробная информация о продукте в Таблице продуктов.Изображения продуктов в таблице ProductImage.И сколько людей спасло этот продукт в таблице SavedProduct.Он возвращает товары, только если пользователь выбрал все фильтры, то есть когда пользователь выбрал красный цвет, марку Nike, хлопчатобумажную ткань и т. Д. Если один из них пропущен, то этот запрос ничего не возвращает.Я хочу, чтобы 1 или 2 были пропущены, а не возвращать данные в соответствии с другими выбранными установщиками.Простите меня, если есть какая-либо ошибка, я новая пчела.И я пропустил соединения.

1 Ответ

0 голосов
/ 22 мая 2019

Это может помочь: -

Примечание: я предполагал, что ProductID находится в других таблицах для создания объединений, в общем, если ваша модель имеет свойства навигации для изображения Product и сохраняет продукт, вам не понадобятся объединения.

 var result = from product in context.Products
                         join img in context.ProductImage on product.ProductID equals img.ProductID
                         join saved in context.SavedProduct on product.ProductID equals saved.ProductID
                         where (
                           (string.IsNullOrEmpty(cat.Color) || cat.Color.Equals(product.Color))
                         & (string.IsNullOrEmpty(cat.BrandName) || cat.Brand_Name.Equals(product.Brand_Name))
                         & (string.IsNullOrEmpty(cat.Fabric) || cat.Fabric.Equals(product.Fabric))
                         & (string.IsNullOrEmpty(cat.Design) || cat.Design.Equals(product.Design))
                         & (
                          ((string.IsNullOrEmpty(cat.Color) ? 1 : 0) +
                          (string.IsNullOrEmpty(cat.BrandName) ? 1 : 0) +
                          (string.IsNullOrEmpty(cat.Fabric) ? 1 : 0) +
                          (string.IsNullOrEmpty(cat.Design) ? 1 : 0)) >= 2) //at least two conditions
                          )
                        select new {
                            product.ProductID,
                            product.Price,
                            product.Brand_Name,
                            product.Title,
                            product.Color,
                            product.Fabric,
                            product.Design,
                            img.Image,
                            saved.ProductSavedCounter,
                        };

Я думаю, что лучшим решением было бы построить его постепенно, как показано ниже: -

 //build the joins
        var result = (from product in context.Products
                      join img in context.ProductImage on product.ProductID equals img.ProductID
                      join saved in context.SavedProduct on product.ProductID equals saved.ProductID
                      select new { product, img, saved }).AsQueryable();

        //get number of conditions avaliable
        var conditionCount = (string.IsNullOrEmpty(cat.Color) ? 1 : 0) +
                      (string.IsNullOrEmpty(cat.Brand_Name) ? 1 : 0) +
                      (string.IsNullOrEmpty(cat.Fabric) ? 1 : 0) +
                      (string.IsNullOrEmpty(cat.Design) ? 1 : 0);

        if (conditionCount >= 2)
        {

            //add the condition if they exists
            if (!string.IsNullOrEmpty(cat.Color))
                result = result.Where(x => cat.Color.Equals(x.product.Color));
            if (!string.IsNullOrEmpty(cat.Brand_Name))
                result = result.Where(x => cat.Brand_Name.Equals(x.product.Brand_Name));
            if (!string.IsNullOrEmpty(cat.Fabric))
                result = result.Where(x => cat.Fabric.Equals(x.product.Fabric));
            if (!string.IsNullOrEmpty(cat.Design))
                result = result.Where(x => cat.Design.Equals(x.product.Design));

            //make the final select
            var finalResult = result.Select(x => new
            {
                x.product.ProductID,
                x.product.Price,
                x.product.Brand_Name,
                x.product.Title,
                x.product.Color,
                x.product.Fabric,
                x.product.Design,
                x.img.Image,
                x.saved.ProductSavedCounter,
            }).ToList();
        }

И если вы имели в виду, что всякий раз, когда какой-либо фильтр отсутствует, запрос должен игнорировать его, удалите счетчик условий и оператор if для него.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...