如果数据库第一次找不到任何值,如何多次正确查询数据库的值

时间:2019-05-31 10:13:59

标签: c# mysql asp.net linq

我正在使用Xamarin构建汽车管理应用程序,而我的后端是ASP.NET Web API。我有大量的汽车数据集,可以通过品牌,名称,年份,里程表和发动机容量找到汽车的价格。我试图对大多数值求平均值,以便可以找到数据,但是很多时候它什么都不返回。因此,我决定尝试多次查询数据库,但是每次它不返回任何内容时,我要么将一个值转换为一个间隔(例如,里程表= 100000,然后里程表> = 80000和&里程表<= 120000)。有点像这样,但是我认为这不是编写它的正确方法。我当时在考虑策略模式,但不知道如何在我的案例中适用。

我试图做的是在存储库中获取汽车对象,然后我有六个方法仅查询数据库,每个方法都使用较少的参数。如果艾尔西斯(If Elses)有很多。

public GetCarPriceResponse GetPrice(GetCarPriceRequest car)
        {
            var price = new GetCarPriceResponse
            {
                Errors = new List<string>()
            };

            if (GetPriceFirst(car) == null)
                if (GetPriceSecond(car) == null)
                    if (GetPriceThird(car) == null)
                        if (GetPriceFourth(car) == null)
                            if (GetPriceFifth(car) == null)
                                if (GetPriceSixth(car) == null)
                                {
                                    price.Success = false;
                                    price.Errors.Add("Could not find car 
price");
                                }
                                else
                                {
                                    price = GetPriceSixth(car);
                                }
                            else price = GetPriceFifth(car);
                        else price = GetPriceFourth(car);
                    else price = GetPriceThird(car);
                else price = GetPriceSecond(car);
            else price = GetPriceFirst(car);

            price.Success = true;

            return price;
        }

第一个功能如下:

public GetCarPriceResponse GetPriceFirst(GetCarPriceRequest car)
        {
            var prices = _context.CarPrices.Where(p =>
                p.make == car.make &&
                p.model == car.model &&
                p.year == car.year &&
                p.CC == car.CC &&
                p.odometer == car.odometer).ToList();

            if (prices.Count == 0) return null;
            return CalculateAveragePrice(prices);
        }

第三个是这样的:

public GetCarPriceResponse GetPriceThird(GetCarPriceRequest car)
        {
            var differenceDown = 0;
            var differenceUp = 0;

            if (car.odometer < 50000)
            {
                differenceDown = 0;
                differenceUp = 50000;
            }
            else if (car.odometer > 50000)
            {
                differenceDown = 50000;
                differenceUp = 50000;
            }
            else if (car.odometer > 215000)
            {
                differenceDown = 50000;
                differenceUp = 0;
            }

            var prices = _context.CarPrices.Where(p =>
                p.make == car.make &&
                p.model == car.model &&
                p.year == car.year &&
                p.CC == car.CC &&
                p.odometer >= car.odometer - differenceDown &&
                p.odometer <= car.odometer + differenceUp).ToList();

            if (prices.Count == 0) return null;
            return CalculateAveragePrice(prices);
        }

在第四部分中,我完全消除了里程表参数,在第六部分中,我查询了一个不同的数据库,该数据库具有基于里程表,发动机容量和型号年份的平均价格。 这是第五种方法:

 public GetCarPriceResponse GetPriceFifth(GetCarPriceRequest car)
        {
            var prices = _context.CarPrices.Where(p =>
                p.make == car.make &&
                p.model == car.model &&
                p.year >= car.year - 2 &&
                p.year <= car.year + 2 &&
                p.CC == car.CC).ToList();

            if (prices.Count == 0) return null;
            return CalculateAveragePrice(prices);
        }

目前它可以正常工作,但是例如,如果您添加了一辆发动机功率为0的电动汽车,它就无法正常运行。 但是我在问是否有办法使这段代码更好。

谢谢。

1 个答案:

答案 0 :(得分:0)

查询每次返回匹配makemodelyearCC的汽车列表时,都不会尝试查找单个汽车(因为这似乎(作为通用标准),然后按里程表值对结果进行排序。然后,您的应用程序可以浏览列表(使用本地LINQ查询)以找到列表中的最佳匹配项。

由于所有网络流量,尝试多次查询单个匹配项将太慢。