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 words

here 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

Popular posts from this blog

iphone - Dismissing a UIAlertView -

intellij idea - Update external libraries with intelij and java -

javascript - send data from a new window to previous window in php -