Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>This should work, even if certainly not complete (nor elegant).</p> <pre><code>public static class LinqQueries { private static MethodInfo miTL = typeof(String).GetMethod("ToLower", Type.EmptyTypes); private static MethodInfo miS = typeof(String).GetMethod("StartsWith", new Type[] { typeof(String) }); private static MethodInfo miC = typeof(String).GetMethod("Contains", new Type[] { typeof(String) }); private static MethodInfo miE = typeof(String).GetMethod("EndsWith", new Type[] { typeof(String) }); public static IQueryable&lt;T&gt; FilterByString&lt;T&gt;(this IQueryable&lt;T&gt; query, Expression&lt;Func&lt;T, string&gt;&gt; propertySelector, StringOperator operand, string value) { ParameterExpression parameterExpression = null; var memberExpression = GetMemberExpression(propertySelector.Body, out parameterExpression); var dynamicExpression = Expression.Call(memberExpression, miTL); Expression constExp = Expression.Constant(value.ToLower()); switch (operand) { case StringOperator.StartsWith: dynamicExpression = Expression.Call(dynamicExpression, miS, constExp); break; case StringOperator.Contains: dynamicExpression = Expression.Call(dynamicExpression, miC, constExp); break; case StringOperator.EndsWith: dynamicExpression = Expression.Call(dynamicExpression, miE, constExp); break; } var pred = Expression.Lambda&lt;Func&lt;T, bool&gt;&gt;(dynamicExpression, new[] { parameterExpression }); return query.Where(pred); } private static Expression GetMemberExpression(Expression expression, out ParameterExpression parameterExpression) { parameterExpression = null; if (expression is MemberExpression) { var memberExpression = expression as MemberExpression; while (!(memberExpression.Expression is ParameterExpression)) memberExpression = memberExpression.Expression as MemberExpression; parameterExpression = memberExpression.Expression as ParameterExpression; return expression as MemberExpression; } if (expression is MethodCallExpression) { var methodCallExpression = expression as MethodCallExpression; parameterExpression = methodCallExpression.Object as ParameterExpression; return methodCallExpression; } return null; } } </code></pre> <p>Will manage</p> <pre><code>xxx.FilterByString(m =&gt; m.Name,...) xxx.FilterByString(m =&gt; m.Test.Name,...) xxx.FilterByString(m =&gt; m.GetValue(),...)//GetValue() returns "string" </code></pre> <p>CAUTION : NullReferenceExceptions aren't managed (if Name is null, or Test is null, or Test.Name is null, or GetValue() returns null)...</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload