Metoda rozszerzenia zwracająca wyrażenie lambda przez porównanie

Jestem w trakcie tworzenia bardziej rozbudowanego systemu filtrowania dla naszego ogromnego projektu. Jednym z głównych predykatów jest możliwość przekazywania porównań za pomocą parametru string. Wyraża to w następującej formie: „> 50” lub „5-10” lub „<123.2”

Co mam (jako przykład do zilustrowania)

ViewModel:

TotalCost (string) (value: "<50")
Required (string) (value: "5-10")

Model EF:

TotalCost (double)
Required(double)

Wyrażenie, którego chciałbym użyć:

model => model.Where(field => field.TotalCost.Compare(viewModel.TotalCost) && field.Required.Compare(viewModel.Required));

Wyrażenie, które chciałbym otrzymać:

model => model.Where(field => field.TotalCost < 50 && field.Required > 5 && field.Required < 10);

Albo coś podobnego do tego

Jednak ... nie mam pojęcia, od czego zacząć. Ograniczyłem to do

public static Expression Compare<T>(this Expression<Func<T, bool>> value, string compare)

To może nie być nawet poprawne, ale chodzi o wszystko, co mam. Narzędzie do porównywania nie jest problemem, to łatwy bit. Trudna część faktycznie zwraca wyrażenie. Nigdy nie próbowałem zwracać wyrażeń jako wartości funkcji. Więc w zasadzie to, co muszę zachować, to pole i zwracam wyrażenie porównawcze.

Jakaś pomoc? : x

Aktualizacja:

Niestety to nie rozwiązuje mojego problemu. Być może dlatego, że pracowałem przez ostatnie 23 godziny, ale nie mam najmniejszego pojęcia, jak zrobić z niego metodę rozszerzenia. Jak powiedziałem, to, co chciałbym ... to w zasadzie sposób na napisanie:

var ex = new ExTest();
var items = ex.Repo.Items.Where(x => x.Cost.Compare("<50"));

Sposób, w jaki ukształtowałem tę funkcję (prawdopodobnie całkowicie błędną) jest

public static Expression<Func<decimal, bool>> Compare(string arg)
{
    if (arg.Contains("<"))
        return d => d < int.Parse(arg);

    return d => d > int.Parse(arg);
}

Brakuje „tej-wartości-wartości”, aby porównać ją na pierwszym miejscu, a ja nie udało mi się jeszcze ustalić, jak można uzyskać dane wejściowe do wyrażenia ... jak w przypadku ReSharper, sugeruje mi to konwersję zamiast tego do boolean ...

Moja głowa jest teraz pełna puchu ...

Aktualizacja 2:

Udało mi się znaleźć sposób na posiadanie fragmentu kodu, który działa w repozytorium pamięci w aplikacji konsoli. Mam jednak jeszcze spróbować z Entity Framework.

public static bool Compare(this double val, string arg)
    {
        var arg2 = arg.Replace("<", "").Replace(">", "");
        if (arg.Contains("<"))
            return val < double.Parse(arg2);

        return val > double.Parse(arg2);
    }

Jednak bardzo wątpię, że właśnie tego oczekuję

Aktualizacja 3:

Właśnie, po ponownym siadaniu i przeglądaniu wyrażeń lambda, przed ostatnią odpowiedzią wymyśliłem coś podobnego do następującego: nie wypełnia on dokładnych wymagań „Porównaj ()”, ale jest to „przeciążenie”. Gdzie metoda:

public static IQueryable<T> WhereExpression<T>(this IQueryable<T> queryable, Expression<Func<T, double>> predicate, string arg)
    {
        var lambda =
            Expression.Lambda<Func<T, bool>>(Expression.LessThan(predicate.Body, Expression.Constant(double.Parse(50.ToString()))));

        return queryable.Where(lambda);
    }

Jednak pomimo moich oczu, wszystko wydaje się logiczne, otrzymuję wyjątek w czasie wykonywania:

System.ArgumentException was unhandled
  Message=Incorrect number of parameters supplied for lambda declaration
  Source=System.Core
  StackTrace:
       at System.Linq.Expressions.Expression.ValidateLambdaArgs(Type delegateType, Expression& body, ReadOnlyCollection`1 parameters)
       at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, String name, Boolean tailCall, IEnumerable`1 parameters)
       at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, Boolean tailCall, IEnumerable`1 parameters)
       at System.Linq.Expressions.Expression.Lambda[TDelegate](Expression body, ParameterExpression[] parameters)

To oczywiście linia winna:

var lambda =
                Expression.Lambda<Func<T, bool>>(Expression.LessThan(predicate.Body, Expression.Constant(double.Parse(50.ToString()))));

Jestem bardzo blisko rozwiązania. Jeśli uda mi się usunąć ten błąd, uważam, że EF powinien być w stanie przetłumaczyć ten błąd na SQL. W przeciwnym razie ... cóż, ostatnia odpowiedź prawdopodobnie pójdzie.

questionAnswers(3)

yourAnswerToTheQuestion