Я пытаюсь кешировать запросы, используя эту функцию:
public static string GenerateCacheKey(string className, string methodName, params object[] parameters)
{
string[] strings = parameters.Select(p => p==null ? "null" : p.ToString()).ToArray();
return string.Format("{0}.{1}({2})", className, methodName, string.Join(",", strings));
}
У меня есть хранилище с такой сигнатурой метода:
IList<TEntity> List(int? page, int? pageSize,
Expression<Func<TEntity, bool>> predicate,
Expression<Func<TEntity, object>> sort);
Фактический вызов этой мощивыглядят так:
var activeItemsForUser =
_itemRepository.List(null, null,
i => i.Active && i.userId=userId, null).ToList();
Проблема в том, что ключ строкового кэша, сгенерированный для i => i.Active && i.userId = userId для userId 123 и userId 456, одинаков.Оба имеют строку «значение» вместо значения userId.
Как я могу сериализовать фактическое выражение со значениями его переменной в уникальную строку для каждого выражения для использования в моем методе GenerateCacheKey?