Как я могу сериализовать конкретное выражение, Func, Lambda в строку со своими значениями? - PullRequest
1 голос
/ 03 ноября 2011

Я пытаюсь кешировать запросы, используя эту функцию:

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?

Ответы [ 2 ]

1 голос
/ 03 ноября 2011

это, вероятно, не слишком полезно, но ...

Вы могли бы создать класс спецификации и использовать его вместо Ключа кеша?

public class ActiveUserSpec : ISpecification<User>
{
    int userId; 
    public ActiveUser(int userId){
       this.userId=userId;    
    }

    public Expression<Func<User, bool>> Match()
    {
        retuen u => u.Active && u.userId == userId;
    }
    public string AsString()
    {
        return GetType().ToString() + userId; 
    }
}
0 голосов
/ 03 ноября 2011

Сериализация дерева выражений не является чем-то простым. В основном вам понадобятся какие-то посетители, чтобы просмотреть все листы выражения и преобразовать их во что-то значимое для сериализации.

В .net нет поддержки сериализации для дерева выражений из коробки.

Но хороший пример вы можете найти здесь:

http://archive.msdn.microsoft.com/ExpressionSerializer

Сериализуется в XML.

...