की आवश्यकता होती है, मैं एक अभिव्यक्ति वृक्ष बनाने की कोशिश कर रहा हूं। मुझे डेटा तालिका से डेटा पढ़ने और इसके कॉलम की जांच करने की आवश्यकता है। कॉलम की जांच की जा सकती है और चेक किए जाने वाले कॉलम की संख्या केवल रन टाइम पर ही जानी जाती है। स्तंभ नाम मुझे स्ट्रिंग सरणी के रूप में दिए जाते हैं और प्रत्येक कॉलम में स्ट्रिंग की सूची की जांच की जाती है। मैंने नीचे दिए गए की तरह नमूना अभिव्यक्ति पेड़ की कोशिश की।ERROR स्टेटिक विधि को शून्य उदाहरण की आवश्यकता होती है, गैर स्थैतिक विधि को गैर-शून्य उदाहरण
यहां मुझे एक त्रुटि आ रही है।
स्टेटिक विधि को शून्य उदाहरण की आवश्यकता होती है, गैर स्थैतिक विधि को गैर-शून्य उदाहरण की आवश्यकता होती है। पैरामीटर नाम: उदाहरण के
लाइन पर
भीतरी = Expression.Call (rowexp, मील, colexp);
कृपया मेरी मदद करें !!!
IQueryable<DataRow> queryableData = CapacityTable
.AsEnumerable()
.AsQueryable()
.Where(row2 => values.Contains(row2.Field<string>("Head1").ToString())
&& values.Contains(row2.Field<string>("Head2").ToString()));
MethodInfo mi = typeof(DataRowExtensions).GetMethod(
"Field",
new Type[] { typeof(DataRow),typeof(string) });
mi = mi.MakeGenericMethod(typeof(string));
ParameterExpression rowexp = Expression.Parameter(typeof(DataRow), "row");
ParameterExpression valuesexp = Expression.Parameter(typeof(List<string>), "values");
ParameterExpression fexp = Expression.Parameter(typeof(List<string>), "types");
Expression inner, outer, predicateBody = null;
foreach (var col in types)
{
// DataRow row = CapacityTable.Rows[1];
ParameterExpression colexp = Expression.Parameter(typeof(string), "col");
// Expression left = Expression.Call(pe, typeof(string).GetMethod("ToLower", System.Type.EmptyTypes));
inner = Expression.Call(rowexp,mi, colexp);
outer = Expression.Call(valuesexp, typeof(List<string>).GetMethod("Contains"), inner);
predicateBody = Expression.And(predicateBody,outer);
}
MethodCallExpression whereCallExpression = Expression.Call(
typeof(Queryable),
"Where",
new Type[] { queryableData.ElementType },
queryableData.Expression,
Expression.Lambda<Func<DataRow,bool>>(predicateBody, new ParameterExpression[] { rowexp }));
क्या आप संभवतः उपर्युक्त पर थोड़ा सा विस्तार कर सकते हैं? आप अभिव्यक्ति के लिए विधि तर्क को पहली तर्क के रूप में क्यों पास करते हैं। यहां विधि कॉल करें? – Kobojunkie
@ कोबोजंकी: क्योंकि आप 'Expression.Call' को बताते हैं कि हम किस स्थिर विधि में रूचि रखते हैं। Http://msdn.microsoft.com/en-us/library/bb301084.aspx देखें –