मैं कुछ बायनेरिज़ को डीकंपाइल करने के लिए रिफ्लेक्टर का उपयोग कर रहा हूं। मुझे लैम्ब्डा एक्सप्रेशंस और विधि में समस्या हो रही है जो ' टी संकलन। लैम्ब्डा अभिव्यक्ति मेरे लिए बहुत जटिल लगती है और मुझे नहीं पता कि इसे वापस संकलित 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 क्लास में "वॉल्यूम" संपत्ति है, और मुझे समझ में नहीं आता कि यह कोड किसी प्रकार की स्थिर संपत्ति को क्यों कॉल कर रहा है जैसे: SubFunctionEntity.get_Volume

2
mani_007 15 अक्टूबर 2011, 11:35

1 उत्तर

सबसे बढ़िया उत्तर

क्या आपने ILSpy आजमाया है? यदि आप LINQ "फ़ंक्शन" सिंटैक्स या from... where सिंटैक्स (View->Options->Decompiler->Decompile query expression और Decompile anonymous methods/lambdas) बनाना चाहते हैं, तो इसे नियंत्रित करने के लिए कुछ विकल्प भी हैं।

आपके अन्य प्रश्न के लिए: SubFunctionEntity.get_Volume, SubFunctionEntity वर्ग की संपत्ति Volume का दाता है।

(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 यादृच्छिक कचरा समान-लेकिन परावर्तक से भिन्न उत्पन्न करता है

3
xanatos 15 अक्टूबर 2011, 13:19
into func एक IEnumerable<FunctionEnctity> बनाता है। where शायद गलत है क्योंकि यह IEnumerable की तुलना sectionEntity.SectionId से करने की कोशिश कर रहा है। इसे into func from func2 in func where fun2.SectionId == sectionEntity.SectionId ... में बदलने का प्रयास करें लेकिन याद रखें कि अब आपके पास func2 है जो कि func का तत्व है।
 – 
xanatos
15 अक्टूबर 2011, 14:14