Uproszczenie kodu - sortowanie po nazwie kolumny

0

nie podoba mi sie ten kod. Chce go uproscic, ale nie do konca wiem jak

            IQueryable<BreakDownRateItem> itemQuery;
            if (rateQueryBreakDownRequest.Ordering != null && !string.IsNullOrWhiteSpace(rateQueryBreakDownRequest.Ordering.ColumnName))
            {
                switch (rateQueryBreakDownRequest.Ordering.ColumnName.ToLowerInvariant())
                {
                    case "date":
                        itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(item => item.Date, rateQueryBreakDownRequest.Ordering);
                        break;
                    case "rate":
                        itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(item => item.Rate, rateQueryBreakDownRequest.Ordering);
                        break;
                    case "restriction":
                        itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(item => string.Join(",", item.Restrictions), rateQueryBreakDownRequest.Ordering);
                        break;
                    default:
                        itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(item => item.Date, rateQueryBreakDownRequest.Ordering);
                        break;
                }
            }
            else
            {
                itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(item => item.Date, rateQueryBreakDownRequest.Ordering);
            }

jedynie do glowy co mi przychodzi to
Dictionary<string, OrderPattern>

ale... jakos nie jestem do tego przekonany
jakies ciekawe pomysly?

2

Mogę się mylić (pisane bez IDE), ale tego całego kodu nie można tego uprościć do czegoś w rodzaju: ?

JakisTyp GetItemCondition(string columnName)
{
    switch (columnName?.ToLowerInvariant())
    {
        case "date": return item => item.Date;  // żeby było ładniej, technicznie default to załatwia
        case "rate": return item => item.Rate;
        case "restriction": return item => string.Join(",", item.Restrictions);
        default: return item => item.Date;
    }
}

// użycie:
var condition = GetItemCondition(rateQueryBreakDownRequest.Ordering?.ColumnName);
var itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(condition, rateQueryBreakDownRequest.Ordering);
3
  1. Install-Package System.Linq.Dynamic

itemQuery = resultOfRateQueryBreakDown.Results.AsQueryable().OrderBy(rateQueryBreakDownRequest.Ordering.ColumnName, rateQueryBreakDownRequest.Ordering.ToString());

3. Przede wszystkim zrób to sortowanie przed materializacją wyników, a nie sortujesz całą tabelę pobraną do pamięci.
0

@fasadin: A nie możesz zmienić rateQueryBreakDownRequest.Ordering.ColumnName dla restriction?

0

@somekind niestety nie moge zmienic

1

To słabo, ale w takim razie przypadki szczególne możesz obsłużyć przez Dictionary<string, Expression<Func<object, object>> (zamiast switcha, który napisał @msm).

1 użytkowników online, w tym zalogowanych: 0, gości: 1