简体   繁体   中英

How can I build Linq query with dynamic OR statements?

The following code:

var dynamicQuery = from a in _context.Users select a;
string[] args = new string[] { "aa", "bb", "cc" };
foreach (string word in args)
    dynamicQuery = dynamicQuery.Where(x => x.Name.Contains(word));
return dynamicQuery.ToList();

Will allow me to create a Linq query with a dynamic list of AND expressions.

But suppose I wanted to do the same, only with a dynamic list of OR expressions?

You don't need to loop at all:

return _context.Users.Where(x => args.Any(word => x.Name.Contains(word)));

EDIT: More generally, you can use:

Func<User, bool> predicate = user => false;
foreach (var item in items)
{
    var predicateCopy = predicate;
    predicate = user => predicateCopy(user) || someOtherCondition;
}
return query.Where(predicate);

This will end up with quite deep stacks (with one delegate calling another calling another etc). Where the specific situation allows you to use Any , that would usually be a better approach.

I would expect Any to work in most situations where you've got a collection of items to potentially match against... the non- Any approach is approprate for "in some situations, anyone over 18 is fine... in some situations anyone with a last name beginning with "G" is appropriate, etc.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM