Уменьшение сложности.Где с повторяющимися действиями в Entity Framework

#c# #entity-framework #linq #linq-to-sql

#c# #entity-framework #linq #linq-to-sql

Вопрос:

У меня есть функция поиска, которая применяет последовательные .Where функции к запросу Entity Framework на основе потенциальных параметров. Одна из этих функций сопоставляет любой элемент, который имеет разницу между максимальными и минимальными значениями из реляционной таблицы на определенную величину. Использует формулу (x-y) / ((x y)/ 2) для вычисления разницы.

Поиск max и min из реляционной таблицы является довольно дорогостоящим и повторяется в текущем запросе. Это работает, но медленно, и я чувствую, что делаю что-то не так;

 records = records.Where(x => x.FoodItems.Count(
    y =>
    y.Updates.Min(u => u.QuantityGrams) > 0 amp;amp;
    (
        y.Updates.Where(u => u.Action == RecordHistory.UpdateTypes.Quantify).GroupBy(u => u.User.Id).Max(u => u.OrderByDescending(z => z.Time).FirstOrDefault().QuantityGrams) -
        y.Updates.Where(u => u.Action == RecordHistory.UpdateTypes.Quantify).GroupBy(u => u.User.Id).Min(u => u.OrderByDescending(z => z.Time).FirstOrDefault().QuantityGrams)
    ) /
    (
        (
            y.Updates.Where(u => u.Action == RecordHistory.UpdateTypes.Quantify).GroupBy(u => u.User.Id).Max(u => u.OrderByDescending(z => z.Time).FirstOrDefault().QuantityGrams)  
            y.Updates.Where(u => u.Action == RecordHistory.UpdateTypes.Quantify).GroupBy(u => u.User.Id).Min(u => u.OrderByDescending(z => z.Time).FirstOrDefault().QuantityGrams)
        ) / 2
    )
    > gvDbl
    ) > 0);
 

Есть ли способ переформатировать это, чтобы мне не нужно было получать min / max дважды или как-то ускорить его?

Комментарии:

1. Этот запрос…. трудно следовать. Вам может понадобиться view / FromSql, который возвращает some (id, min, max) , чтобы вы могли присоединиться к нему.

2. Это RecordHistory.UpdateTypes.Quantify значение в вашем локальном процессе или значение в базе данных? Есть RecordHistory ли таблица в базе данных?