Есть ли в любом случае я могу оптимизировать этот код намного короче? - PullRequest
0 голосов
/ 11 июля 2019

Можно ли как-нибудь оптимизировать этот код в более короткий?MakeList, TrimList и т. Д. Являются типом списка.и Автомобиль являются моделями.Моя проблема в том, что код очень длинный.У меня 20 объекта в модели.


if (MakeList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => MakeList.Contains(b.Vehicle.Make));
}
if (TrimList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => TrimList.Contains(b.Vehicle.Trim));
}
if (ModelList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => ModelList.Contains(b.Vehicle.Model));
}
if (StockNoList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => StockNoList.Contains(b.Vehicle.StockNo));
}
if (BodyStyleList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => BodyStyleList.Contains(b.Vehicle.Body));
}
if (ExtColorList?.Any() == true)
{
    bidVehicles = bidVehicles.Where(b => ExtColorList.Contains(b.Vehicle.Exterior));
}

return bidVehicles;

1 Ответ

3 голосов
/ 11 июля 2019

Для LINQ к объектам:

public static class FilterExt
{
    public static IEnumerable<TItem> ApplyFilter<TProp>(this IEnumerable<TItem> list, List<TProp> filter, Func<TItem, TProp> prop)
    {
        if (filter == null || filter.Count == 0)
        {
            return list;
        }

        return list.Where(x => filter.Contains(prop.Invoke(x)));
    }
}

...

var filtered = bidVehicles
    .ApplyFilter(MakeList, x => x.Vehicle.Make)
    .ApplyFilter(TrimList, x => x.Vehicle.Trim).ToList();

Если вы используете EF (значит bidVehicles - это IQueryable), вы должны написать выражение для каждого свойства, потому что вам нужен полный предикат Expression<Func<BidVehicle, bool>>, а не просто Func<BidVehicle, TProp>.

...