silverlight - Build dynamic Expression for search -
silverlight - Build dynamic Expression for search -
i'm in trouble, can't figure out seems simple thing in plain sql can done within 1 minute, it's been several hours far. here situation:
i have single field user may come in many words he/she likes i need build look find match let's there 3 fields in database: firstname, middlename, lastname i need split search entry , compare against 3 fields i'm dealing silverlight ria, ef once 1 time again search entry contains unknown number of wordshere under i'm trying accomplish, homecoming type mandatory:
public expression<func<myentity, bool>> getsearchexpression(string text) { expression<func<myentity, bool>> result; var keywords = text.trim().split(" "); foreach(var keyword in keywords) { // todo: // check whether 'or' required (i.e. after sec loop) // (firstname = 'keyword' // , // middlename = 'keyword' // , // lastname = 'keyword') // or // (firstname '%keyword%' // , // middlename '%keyword%' // , // lastname '%keyword%') } homecoming result; }
thanks in advance!
the simplest thing utilize joe albahari's predicatebuilder this:
var predicate = predicatebuilder.false<myentity>(); foreach (string keyword in keywords) { string temp = keyword; predicate = predicate.or ( p => p.firstname.contains (temp) && p.lastname.contains (temp) && p.middlename.contains (temp)); } homecoming predicate;
i left out equality-checks because "contains" (i.e. like '%...%'
) cover possibility anyway.
i have point out, though, conditions don't create sense, business logic standpoint. under circumstances want find first, last, , middle name contain "john"? suspect want more this:
var predicate = predicatebuilder.true<myentity>(); foreach (string keyword in keywords) { string temp = keyword; predicate = predicate.and ( p => p.firstname.contains (temp) || p.lastname.contains (temp) || p.middlename.contains (temp)); } homecoming predicate;
one final note: because predicatebuilder requires phone call .asexpandable()
when creating query, don't know whether work you. might have resort building own expressions, can tedious. can started, though:
var pparam = expression.parameter(typeof(myentity), "p"); var predicate = expression.constant(true); foreach (string keyword in keywords) { var keywordexpr = expression.constant(keyword); // todo: create look invoke .firstname getter // todo: create look invoke string.contains() method //todo: same lastname , middlename predicate = expression.and(predicate, expression.or( expression.or(firstnamecontainskeyword, middlenamecontainskeyword), lastnamecontainskeyword)); } homecoming expression.lambda<func<myentity, bool>>(predicate, pparam);
silverlight entity-framework expression ria
Comments
Post a Comment