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
Post a Comment