Note that there are some explanatory texts on larger screens.

plurals
  1. POCreate fully dynamic where clause with expression tree and execute on IQueryable
    text
    copied!<p>At point (3) in my code I have defined a query called query1 in which I defined a .Where lambda expression. This query is in some way dynamic but still contains static elements, it always refers to the Type Employee and its (int) property ClientID. </p> <p>Now I very much like to make the refering to the type and its property dynamic, based on the method parameters which by example are shown below point (1). </p> <p>What I tried to so far is making the static part of the query defined under point (3) fully dynamic by replacing it with a more elaborate expression tree as written down in (4), (5) &amp; (6). But when I try to add everything together it says I call .Where with wrong parameters. I don't know how to call .Where with the right parameters in order to create a fully dynamic select. </p> <p>Does someone know to solve this problem? I have spent a day searching and haven't found a solution so far.</p> <pre><code> dsMain domainService = new dsMain(); //(1)i want to rewrite the following four variables to method-parameters Type entityType = typeof(Employee); String targetProperty = "ClientID"; Type entityProperty = typeof(Employee).GetProperty(targetProperty).PropertyType; int idToDelete = 5; //(2)create expression-function: idToDelete == entityType.targetProperty (in this case: Employee.ClientID) ParameterExpression numParam = Expression.Parameter(entityProperty, targetProperty.Substring(0, 3)); ConstantExpression equalTarget = Expression.Constant(idToDelete, idToDelete.GetType()); BinaryExpression intEqualsID = Expression.Equal(numParam, equalTarget); Expression&lt;Func&lt;int, bool&gt;&gt; lambda1 = Expression.Lambda&lt;Func&lt;int, bool&gt;&gt;( intEqualsID, new ParameterExpression[] { numParam }); //(3)I want to create query1 fully dynamic, so defining Employee or an other type and its property at run time WhereClause = lambda1.Compile(); IQueryable&lt;Employee&gt; employees = domainService.GetEmployees(); var query1 = employees.Where&lt;Employee&gt;(C =&gt; WhereClause.Invoke(C.ClientID)).Expression; //(4)create the operand body {value(ASP.test_aspx).WhereClause.Invoke(E.ClientID)} var operandbodyMethod = WhereClause.GetType().GetMethod("Invoke"); var operandbodyType = typeof(System.Boolean); var operandbodyArgs1Expression = Expression.Parameter(entityType, entityType.Name.Substring(0, 1)); var operandbodyArgs1 = Expression.MakeMemberAccess(operandbodyArgs1Expression, entityType.GetMember(targetProperty)[0]); var operandBodyObjectExp = Expression.Constant(this, this.GetType()); var operandbodyObject = Expression.MakeMemberAccess(operandBodyObjectExp, this.GetType().GetMember("WhereClause")[0]); //(5)create the operand {E =&gt; value(ASP.test_aspx).WhereClause.Invoke(E.ClientID)} var operandbody = Expression.Call(operandbodyObject, operandbodyMethod, operandbodyArgs1); var operandParameter = Expression.Parameter(entityType, entityType.Name.Substring(0, 1)); var operandType = typeof(Func&lt;,&gt;).MakeGenericType(entityType, typeof(System.Boolean)); //(6) var operand = Expression.Lambda(operandType, operandbody, new ParameterExpression[] { operandParameter }); var expressionType = typeof(Expression&lt;&gt;).MakeGenericType(operandType); var completeWhereExpression = Expression.MakeUnary(ExpressionType.Quote, operand, expressionType); //(7)the line below does not work var query2 = employees.Where&lt;Employee&gt;(completeWhereExpression).Expression; </code></pre> <p>Thank you very much for reading my question! If you have questions about my question, please ask them:)</p>
 

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