Рефлектор генерирует лямбда-выражение, как получить обратно фактический запрос Linq?
Я использую Reflector для декомпиляции некоторых двоичных файлов. У меня возникли проблемы с лямбда-выражениями и method of, который не компилируется. лямбда-выражение кажется мне очень сложным, и я понятия не имею, как преобразовать его обратно в компилируемый код LINQ. вот код:
public double? LoadSumRialAmount(long functionId, long? subFunctionId)
{
        ParameterExpression expression;
        if (!subFunctionId.HasValue)
        {
            return (from func in base.MetaData.SubFunction
                where func.FunctionId == functionId
                select func).Select<SubFunctionEntity, double?>(System.Linq.Expressions.Expression.Lambda<Func<SubFunctionEntity, double?>>(System.Linq.Expressions.Expression.Multiply(System.Linq.Expressions.Expression.Property(expression = System.Linq.Expressions.Expression.Parameter(typeof(SubFunctionEntity), "func"), (MethodInfo) methodof(SubFunctionEntity.get_Volume)), System.Linq.Expressions.Expression.Property(expression, (MethodInfo) methodof(SubFunctionEntity.get_RialAmount))), new ParameterExpression[] { expression })).Sum();
        }
        return (from func in base.MetaData.SubFunction
            where (func.FunctionId == functionId) && (func.SubFunctionId != subFunctionId)
            select func).Select<SubFunctionEntity, double?>(System.Linq.Expressions.Expression.Lambda<Func<SubFunctionEntity, double?>>(System.Linq.Expressions.Expression.Multiply(System.Linq.Expressions.Expression.Property(expression = System.Linq.Expressions.Expression.Parameter(typeof(SubFunctionEntity), "func"), (MethodInfo) methodof(SubFunctionEntity.get_Volume)), System.Linq.Expressions.Expression.Property(expression, (MethodInfo) methodof(SubFunctionEntity.get_RialAmount))), new ParameterExpression[] { expression })).Sum();
}
Еще одна ошибка-класс SubFunctionEntity имеет свойство Volume, и я не понимаю, почему этот код вызывает какое-то статическое свойство, например: SubFunctionEntity.get_Volume1 ответ:
Вы пробовали ILSpy ? Он даже имеет некоторые опции для управления, если вы хотите создать синтаксис LINQ "function" или
from... whereсинтаксис (View->Options->Decompiler->Decompile query expressionиDecompile anonymous methods/lambdas)Для вашего другого вопроса:
SubFunctionEntity.get_Volumeявляется геттером свойстваVolumeклассаSubFunctionEntity.
(MethodInfo) methodof(SubFunctionEntity.get_Volume)это то же самое, что иtypeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod(), только выполняется во время компиляции, а не во время выполнения. Проблема в том, что C# не имеетmethodof"функции".Если вы действительно хотите использовать то, что дал вам рефлектор, это "исправленная" версия:
public double? LoadSumRialAmount(long functionId, long? subFunctionId) { ParameterExpression expression; if (!subFunctionId.HasValue) { return (from func in base.MetaData.SubFunction where func.FunctionId == functionId select func).Select<SubFunctionEntity, double?>(Expression.Lambda<Func<SubFunctionEntity, double?>>(Expression.Multiply(Expression.Property(expression = Expression.Parameter(typeof(SubFunctionEntity), "func"), typeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod()), Expression.Property(expression, typeof(SubFunctionEntity).GetProperty("RialAmount").GetGetMethod())), new ParameterExpression[] { expression })).Sum(); } return (from func in base.MetaData.SubFunction where (func.FunctionId == functionId) && (func.SubFunctionId != subFunctionId) select func).Select<SubFunctionEntity, double?>(Expression.Lambda<Func<SubFunctionEntity, double?>>(Expression.Multiply(Expression.Property(expression = Expression.Parameter(typeof(SubFunctionEntity), "func"), typeof(SubFunctionEntity).GetProperty("Volume").GetGetMethod()), Expression.Property(expression, typeof(SubFunctionEntity).GetProperty("RialAmount").GetGetMethod())), new ParameterExpression[] { expression })).Sum(); }Обратите внимание, что вам понадобится использовать:
using System.Linq; using System.Linq.Expressions;Ах... наиболее сложным выражением является:
func => (func.Volume * func.RialAmount), поэтому вы можете записать метод как:public double? LoadSumRialAmount(long functionId, long? subFunctionId) { if (!subFunctionId.HasValue) { return (from func in base.MetaData.SubFunction where func.FunctionId == functionId select func).Select(func => (func.Volume * func.RialAmount)).Sum(); } return (from func in base.MetaData.SubFunction where (func.FunctionId == functionId) && (func.SubFunctionId != subFunctionId) select func).Select(func => (func.Volume * func.RialAmount)).Sum(); }Добавление: проверено, ILSpy производят случайный мусор, подобный-но отличный от рефлектора