c# - Call Ignore Case for Contains Method using a generic LINQ Expression -


i using below code generic filter, search text passed contains method case sensitive, how can write ignore case.

public static class queryextensions {     public static iqueryable<t> filter<t>(this iqueryable<t> query, string search)         {                    var properties = typeof(t).getproperties().where(p =>                  /*p.getcustomattributes(typeof(system.data.objects.dataclasses.edmscalarpropertyattribute),true).any() && */                 p.propertytype == typeof(string));                  var predicate = predicatebuilder.false<t>();         foreach (var property in properties )         {            predicate = predicate.or(createlike<t>(property,search));         }         return query.asexpandable().where(predicate);     }     private static expression<func<t,bool>> createlike<t>( propertyinfo prop, string value)     {                var parameter = expression.parameter(typeof(t), "f");         var propertyaccess = expression.makememberaccess(parameter, prop);                             var = expression.call(propertyaccess, "contains", null, expression.constant(value,typeof(string)));          return expression.lambda<func<t, bool>>(like, parameter);            }  } 

instead of calling string.contains, call string.indexof case insensitive stringcomparison parameter. compare result 0, expression.greaterthanorequal expression. need provide parameter in expression.call expression.constant.

you can decide hardcode 1 of case-insensitive stringcomparison options, or export parameter of filter method, allowing users decide whether want case-insensitive search or not.

you can this:

    private static expression<func<t, bool>> createlike<t>(propertyinfo prop, string value)     {         var parameter = expression.parameter(typeof(t), "f");         var propertyaccess = expression.makememberaccess(parameter, prop);          var indexof = expression.call(propertyaccess, "indexof", null, expression.constant(value, typeof(string)),expression.constant(stringcomparison.invariantcultureignorecase));         var like=expression.greaterthanorequal(indexof, expression.constant(0));         return expression.lambda<func<t, bool>>(like, parameter);     } 

or, stringcomparison parameter

    private static expression<func<t, bool>> createlike<t>(propertyinfo prop,          string value,          stringcomparison comparison=stringcomparison.invariantcultureignorecase)     {         var parameter = expression.parameter(typeof(t), "f");         var propertyaccess = expression.makememberaccess(parameter, prop);          var indexof = expression.call(propertyaccess, "indexof", null,              expression.constant(value, typeof(string)),             expression.constant(comparison));         var like=expression.greaterthanorequal(indexof, expression.constant(0));         return expression.lambda<func<t, bool>>(like, parameter);     } 

by using default value comparison avoid creating 2 overloads same job.


Comments

Popular posts from this blog

curl - PHP fsockopen help required -

HTTP/1.0 407 Proxy Authentication Required PHP -

java - More than one row with the given identifier was found: 1, for class: com.model.Diagnosis -