我正在使用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的电动汽车,它就无法正常运行。 但是我在问是否有办法使这段代码更好。
谢谢。
答案 0 :(得分:0)
查询每次返回匹配make
,model
,year
和CC
的汽车列表时,都不会尝试查找单个汽车(因为这似乎(作为通用标准),然后按里程表值对结果进行排序。然后,您的应用程序可以浏览列表(使用本地LINQ查询)以找到列表中的最佳匹配项。
由于所有网络流量,尝试多次查询单个匹配项将太慢。