मैं एक लैम्ब्डा अभिव्यक्ति बनाने की कोशिश कर रहा हूं जिसे फ़िल्टरिंग के लिए दूसरों के साथ एक बड़े अभिव्यक्ति वृक्ष में जोड़ा जाएगा। यह तब तक ठीक काम करता है जब तक मुझे उप संग्रह संपत्ति द्वारा फ़िल्टर करने की आवश्यकता न हो।संग्रह संपत्ति पर फ़िल्टर करने के लिए एक गतिशील अभिव्यक्ति वृक्ष का निर्माण
आप एक लैम्ब्डा अभिव्यक्ति कैसे बनाते हैं जो किसी संग्रह की संपत्ति पर किसी भी() का उपयोग करके फ़िल्टर करेगा जो रूट ऑब्जेक्ट की संपत्ति है?
उदाहरण:
CurrentDataSource.Offices.Where(o => o.base_Trades.Any(t => t.Name == "test"))
यह कैसे मैं अभिव्यक्ति स्थिर का निर्माण होगा, लेकिन मैं यह गतिशील रूप का निर्माण करने की जरूरत है। गलतफहमी के लिए खेद है।
संपादित करें:
IQueryable<Office> officeQuery = CurrentDataSource.Offices.AsQueryable<Office>();
ParameterExpression pe = Expression.Parameter(typeof(Office), "Office");
ParameterExpression tpe = Expression.Parameter(typeof(Trades), "Trades");
Expression SimpleWhere = null;
Expression ComplexWhere = null;
foreach (ServerSideFilterObject fo in ssfo)
{
SimpleWhere = null;
foreach (String value in fo.FilterValues)
{
if (!CollectionProperties.Contains(fo.PropertyName))
{
//Handle singleton lambda logic here.
Expression left = Expression.Property(pe, typeof(Office).GetProperty(fo.PropertyName));
Expression right = Expression.Constant(value);
if (SimpleWhere == null)
{
SimpleWhere = Expression.Equal(left, right);
}
else
{
Expression e1 = Expression.Equal(left, right);
SimpleWhere = Expression.Or(SimpleWhere, e1);
}
}
else
{
//handle inner Collection lambda logic here.
Expression left = Expression.Property(tpe, typeof(Trades).GetProperty("Name"));
Expression right = Expression.Constant(value);
Expression InnerLambda = Expression.Equal(left, right);
//Problem area.
Expression OfficeAndProperty = Expression.Property(pe, typeof(Office).GetProperty(fo.PropertyName));
Expression OuterLambda = Expression.Call(OfficeAndProperty, typeof(Trades).GetMethod("Any", new Type[] { typeof(Expression) }),InnerLambda);
if (SimpleWhere == null)
SimpleWhere = OuterLambda;
else
SimpleWhere = Expression.Or(SimpleWhere, OuterLambda);
}
}
if (ComplexWhere == null)
ComplexWhere = SimpleWhere;
else
ComplexWhere = Expression.And(ComplexWhere, SimpleWhere);
}
MethodCallExpression whereCallExpression = Expression.Call(typeof(Queryable), "Where", new Type[] { officeQuery.ElementType }, officeQuery.Expression, Expression.Lambda<Func<Office, bool>>(ComplexWhere, new ParameterExpression[] { pe }));
results = officeQuery.Provider.CreateQuery<Office>(whereCallExpression);
क्या आप एक अभिव्यक्ति वृक्ष बनाने के लिए पूछ रहे हैं? – SLaks
मुझे यकीन नहीं है कि पदानुक्रम आपके उदाहरण में कैसे काम करता है। क्या आप उस पर थोड़ा और विस्तार कर सकते हैं? क्या कार्यालय रूट है और फिर प्रत्येक कार्यालय में ट्रेडों का संग्रह होता है? और आप व्यापार के नाम पर फ़िल्टर करना चाहते हैं ?? फ़िल्टर वह जगह है जहां मैं थोड़ा खो गया हूं। माफ़ कीजिये। –
नहीं, मैं सिर्फ एक आंतरिक विधि कॉल और पैरामीटर के लिए अभिव्यक्ति के साथ अभिव्यक्ति बनाने के लिए प्रयुक्त वाक्यविन्यास से अनिश्चित हूं। इस मामले में, मुझे यह बताते हुए एक त्रुटि मिल रही है कि कोई भी() नहीं मिला क्योंकि मेरे पैरामीटर परिभाषा से मेल नहीं खाते हैं। इस मामले में मुझे यकीन नहीं है कि ऐसा इसलिए है क्योंकि मैं वाक्यविन्यास पर हूं या यदि कोई भी() इसका उपयोग करने के तरीके में समर्थित नहीं है। – George