c# - How can I do a Func<object[],Expression<Func<T,bool>>> dynamic? -
i working on doing .find(objects[] keys) method dynamically creates lambda function query database.
basically want is:
var mykeys = new guid("37ec1659-b35e-46c9-a7fc-e9802644ca1a"); iqueryable<t> database ; func<object[],expression<func<t,bool>>> objectfinder = createkeyexpression(typeof(t)); var foundobject = database.firstordefault(objectfinder(mykeys)); and
private lambdaexpression createkeyexpression(type c1type) { parameterexpression instanceparameter = expression.parameter(c1type); parameterexpression keyparameters = expression.parameter(typeof(object[])); propertyinfo[] objectkeys = c1type.getkeyproperties().toarray(); var expr = expression.equal( expression.typeas( expression.property(instanceparameter,objectkeys[0]),typeof(object)), expression.arrayindex(keyparameters,expression.constant(0))); (int = 1; < objectkeys.length; i++) { expr = expression.andalso(expr, expression.equal( expression.property(instanceparameter,objectkeys[i]), expression.arrayindex(keyparameters,expression.constant(i)) )); } var lmp= expression.lambda(expr, instanceparameter); return expression.lambda(lmp, keyparameters); } any ideas of how can achieve this? above gives me func<object[],func<t,bool>>, makes iqueryable ienumerable, meaning won't on database end.
you need use expression.constant method instead of expression.arrayindex, because not able pass expression array key values using firstordefault method.
private static lambdaexpression createkeyexpression(type c1type, object[] parameters) { var instanceparameter = expression.parameter(c1type); propertyinfo[] objectkeys = c1type.getkeyproperties().toarray(); var expr = expression.equal(expression.property(instanceparameter, objectkeys[0]), expression.constant(parameters[0], objectkeys[0].propertytype)); (int = 1; < objectkeys.length; i++) { expr = expression.andalso(expr, expression.equal( expression.property(instanceparameter, objectkeys[i]), expression.constant(parameters[i], objectkeys[i].propertytype))); } return expression.lambda(expr, instanceparameter); } var parameters = new object[] { guid.newguid(), guid.newguid() }; var lambdaexpression = createkeyexpression(typeof(testclass), parameters); var testclasses = new list<testclass>() { new testclass { id = (guid)parameters[0], id1 = (guid)parameters[1] } }; var testclass = testclasses.asqueryable().firstordefault((expression<func<testclass, bool>>)lambdaexpression);
Comments
Post a Comment