Преобразование лямбда-выражения в уникальный ключ для кэширования

Я просмотрел другие вопросы, похожие на этот, но не смог найти подходящих ответов.

Я использовал следующий код для создания уникальных ключей для хранения результатов моих linq-запросов к кешу.

    string key = ((LambdaExpression)expression).Body.ToString();

    foreach (ParameterExpression param in expression.Parameters)
    {
        string name = param.Name;
        string typeName = param.Type.Name;

        key = key.Replace(name + ".", typeName + ".");
    }

    return key;

Кажется, что это нормально работает для простых запросов, содержащих целые числа или логические значения, но когда мой запрос содержит вложенные константные выражения, например.

// Get all the crops on a farm where the slug matches the given slug.
(x => x.Crops.Any(y => slug == y.Slug) && x.Deleted == false)

Возвращаемый ключ выглядит следующим образом:

(True AndAlso (Farm.Crops.Any(y => (значение (OzFarmGuide.Controllers.FarmController+<>c__DisplayClassd).slug == y.Slug)) AndAlso (Farm.Deleted == False)))

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

Также было бы неплохо преобразовать yв правильное имя типа.....

10
задан James South 19 March 2012 в 09:26
поделиться