2010-10-13 13 views
6

मेरे पास स्ट्रिंग मानों का उपयोग करके लिंक क्वेरी को गतिशील रूप से फ़िल्टर करने के लिए एक लिंक एक्सटेंशन विधि है। उदाहरण के लिए: query.WhereHelper("columName", ">", 1)। मैं ग्रेटरथान या नोटएक्वल इत्यादि जैसे कई अलग-अलग फ़िल्टर ऑपरेटर का उपयोग कर सकता हूं लेकिन "पसंद नहीं"। कोई अभिव्यक्ति नहीं है। पसंद या अभिव्यक्ति। स्टार्ट्स इत्यादि। मैं अपने अभिव्यक्ति पेड़ में ऑपरेटर की तरह कैसे कार्यान्वित कर सकता हूं? यहाँ मेरी कोड है:अभिव्यक्ति वृक्ष में ऑपरेटर की तरह

public static IQueryable<T> WhereHelper<T>(this IQueryable<T> source, string columnName, object value, string filterType) 
{ 
    ParameterExpression table = Expression.Parameter(typeof(T), ""); 
    Expression column = Expression.PropertyOrField(table, columnName); 
    Expression valueExpression = Expression.Convert(Expression.Constant(value), column.Type); 
    Expression where = null; 

    switch (filterType) 
    { 
     case "<": 
      where = Expression.LessThan(column, valueExpression); 
      break; 
     case "<=": 
      where = Expression.LessThanOrEqual(column, valueExpression); 
      break; 
     case "=": 
      where = Expression.Equal(column, valueExpression); 
      break; 
     case ">": 
      where = Expression.GreaterThan(column, valueExpression; 
      break; 
     case ">=": 
      where = Expression.GreaterThanOrEqual(column, valueExpression); 
      break; 
     case "<>": 
      where = Expression.NotEqual(column, valueExpression); 
      break; 
    } 

    Expression lambda = Expression.Lambda(where, new ParameterExpression[] { table }); 

    Type[] exprArgTypes = { source.ElementType }; 

    MethodCallExpression methodCall = Expression.Call(typeof(Queryable), 
                 "Where", 
                 exprArgTypes, 
                 source.Expression, 
                 lambda); 

    return (IQueryable<T>)source.Provider.CreateQuery<T>(methodCall); 

उत्तर

7

आप string.StartsWith, string.Contains, string.EndsWith आदि तरीकों के साथ Expression.Call का प्रयोग करेंगे। यह उपभोग करने वाले कोड के लिए इसे वापस टीएसक्यूएल में अनुवाद करने के लिए है। ध्यान दें कि LINQ-to-SQL के लिए यहां कुछ अतिरिक्त सहायक कार्य भी हैं, लेकिन ईएफ के साथ नहीं।

+1

"सहायक कार्यों" मेरा मतलब है कर रहे हैं [ 'SqlMethods'] (http://msdn.microsoft.com/en-us/library/system। data.linq.sqlclient.sqlmethods.aspx) - विशेष रूप से 'पसंद() ' –

+1

ईएफ के बारे में टिप्पणी गलत है। नहीं है [EntityFunctions] (http://msdn.microsoft.com/en-us/library/system.data.objects.entityfunctions.aspx) जो 'L2S के लिए SqlMethods' को analagous है। हालांकि, 'एंड्सविथ' और 'कंटेनस' जैसे कार्यों को ईएफ में मूल रूप से समर्थित किया गया है और ऐसे सहायकों की आवश्यकता नहीं है। –

+0

@ क्रिएग धन्यवाद; मैं उस बारे में नहीं जानता था। –

6

इस प्रकार आप अभिव्यक्ति की तरह परिभाषित कर सकते हैं,

var propertyName = "Firstname"; 
var propertyValue= "xxxx"; 

MethodInfo refmethod = typeof(string).GetMethod("Contains", new[] { typeof(string) }); 
var parameter = Expression.Parameter(typeof(T), "type"); 
var property = Expression.Property(parameter, propertyName); 
var value = Expression.Constant(propertyValue, typeof(string)); 
var containsMethodExp = Expression.Call(property, refmethod, value); 
+0

परीक्षण किया और ठीक से काम करता है। आपने मेरा दिन बचाया! धन्यवाद! – GiveEmTheBoot

संबंधित मुद्दे