Повторное использование частей SQL запроса

Я пытаюсь вынести часть ef core запроса в отдельный метод, который в последствии можно встроить в любой запрос чтобы в случае чего не приходилось бегать по всему проекту и менять один и тот-же код везде. Спустя некоторое количество страниц гугла я набрёл на такую штуку как LINQKit, вроде как выглядело многообещающе до того как я попробовал применить его на практике. Я хотел использовать выражение внутри Select, на этом этапе никаких ошибок не возникло: добавил AsExpandable к моему DbSet, вызвал мой метод и применил на нём Invoke, всё шло хорошо. Но вот само выражение начало вызывать некоторые проблемы.

Что я попробовал:

static Expression<Func<Item, decimal>> GetItemPriceExpression(DateTime date) =>
 item => item.Price * (1m - (item.Discounts.FirstOrDefault(discount => discount.EndDate > date && discount.StartDate < date)?.DiscountSize ?? 0) / 100m);
// Ошибка компиляции CS8072: Лямбда дерева выражения не может содержать оператор распространения значений NULL.

static Expression<Func<Item, decimal>> GetItemPriceExpression(DateTime date) =>
 item => item.Price * (1m - item.Discounts.FirstOrDefault(discount => discount.EndDate > date && discount.StartDate < date).DiscountSize / 100m);
// System.InvalidOperationException: Nullable object must have a value.
// Довольно близко - запрос корректно формируется (выражение встраивается в запрос) и отправляется в бд, но дальше этого не уходит

static Expression<Func<Item, decimal>> GetItemPriceExpression(DateTime date) =>
 item => item.Price * (1m - item.Discounts.Where(discount => discount.EndDate > date && discount.StartDate < date).Select(discount => discount.DiscountSize).FirstOrDefault(0) / 100m);
// System.ArgumentException: Expression of type 'System.Linq.IQueryable`1[System.Int32]' cannot be used for parameter of type 'System.Linq.IQueryable`1[Database.Discount]' of method 'System.Linq.IQueryable`1[Database.Discount] Where[Discount](System.Linq.IQueryable`1[Database.Discount], System.Linq.Expressions.Expression`1[System.Func`2[Database.Discount,System.Boolean]])'

Возможно я что-то делаю не так, но по логике последний вариант должен работать. Однако он выкидывает исключение, не совсем понятно почему.

Я в выражения до этого ни разу не залазил, есть вероятность что я упускаю что-то довольно очевидное.


Ответы (0 шт):