В твоём примере сначала выполняется _container.Where. Сложность — O(N).
Потом OrderByDescending. Сложность — O(N*ln(N)).
Потом Where(All). Сложность O(N*M).
Итого, общая сложность — O(N*M*ln(N)), где N — число пользователей, а M — лайки данного пользователя. Это очень медленно.
То, что предложил я, выполняется полностью на стороне БД с использованием индексов, без index scan-ов. Сложность не знаю как посчитать, но должно быть в разы быстрее. :)
Нехорошо сравнивать строки, приводя их к нижнему регистру, поскольку результат будет зависеть от выбранной культуры. Например, в турецком языке «FILENAME.BIN».ToLower().EndsWith(".bin") == false, т.к. «FILENAME.BIN» будет преобразовано в «fılname.bın» (без точки над i).
Формула «abs(r1-r2) + abs(g1 — g2) + abs(b1 — b2)» вряд ли подойдёт, поскольку для пар (#FF0000, #000000) и (#0000FF, #000000) будет выдавать одинаковый результат.
Потом OrderByDescending. Сложность — O(N*ln(N)).
Потом Where(All). Сложность O(N*M).
Итого, общая сложность — O(N*M*ln(N)), где N — число пользователей, а M — лайки данного пользователя. Это очень медленно.
То, что предложил я, выполняется полностью на стороне БД с использованием индексов, без index scan-ов. Сложность не знаю как посчитать, но должно быть в разы быстрее. :)