मैं एक ऐसा करने पर काम कर रहा हूं। ढूँढें (ऑब्जेक्ट्स [] कुंजी) विधि जो डेटाबेस को क्वेरी करने के लिए गतिशील रूप से लैम्ब्डा फ़ंक्शन बनाता है।मैं एक Func <object [], अभिव्यक्ति <Func<T,bool> >> गतिशील कैसे कर सकता हूं?
असल में मैं क्या चाहते हैं:
var mykeys = new Guid("37ec1659-b35e-46c9-a7fc-e9802644ca1a");
IQueryable<T> database ;
Func<object[],Expression<Func<T,bool>>> objectFinder = CreateKeyExpression(typeof(T));
var foundObject = database.FirstOrDefault(objectFinder(mykeys));
और
private LambdaExpression CreateKeyExpression(Type C1Type)
{
ParameterExpression instanceParameter = Expression.Parameter(C1Type);
ParameterExpression keyParameters = Expression.Parameter(typeof(object[]));
PropertyInfo[] objectKeys = C1Type.GetKeyProperties().ToArray();
var expr = Expression.Equal(Expression.TypeAs(Expression.Property(instanceParameter,objectKeys[0]),typeof(object)),
Expression.ArrayIndex(keyParameters,Expression.Constant(0)));
for (int i = 1; i < objectKeys.Length; i++)
{
expr = Expression.AndAlso(expr, Expression.Equal(
Expression.Property(instanceParameter,objectKeys[i]),
Expression.ArrayIndex(keyParameters,Expression.Constant(i))
));
}
var lmp= Expression.Lambda(expr, instanceParameter);
return Expression.Lambda(lmp, keyParameters);
}
मैं यह कैसे प्राप्त कर सकते हैं की कोई भी विचार? उपर्युक्त मुझे Func<object[],Func<T,bool>>
देता है, जो IQueryable को IQueryumerable बनाता है, जिसका अर्थ है कि यह डेटाबेस अंत में नहीं करेगा।
दिलचस्प, मैं इसे थोड़ा अलग हल किया। CreateKeyExpression में ऑब्जेक्ट [] पैरामीटर डालना एक विकल्प नहीं था। मैं किसी दिए गए सी 1 टाइप के लिए अभिव्यक्ति को कैश करने में सक्षम होना चाहता था क्योंकि मैंने एक Func