I have a entity model
public class User{
public string FirstName {get;set;}
public string LastName {get;set;}
public string Department {get;set;}
}
So I want to search a text like "john smith"
in database using entity framework core 3.1.
I am splitting the text before.
public async Task<IEnumerable<UserListViewModel>> Search(string search)
{
var terms = search.Split(" ");
var queryable = _context.Users.Where(s => terms.All(m => s.Department.ToLower().Contains(m)) ||
terms.All(m => s.FirstName.ToLower().Contains(m)) ||
terms.All(m => s.LastName.ToLower().Contains(m))).AsQueryable();
...........
...........
...........
}
but does it not work.
So how can I do it?
EF Core 3.x doesn't really support translation of
All
andAny
in most cases, and your code is slightly wrong, I think what you really want is:Since this can't be translated, you need to reformat it into code that can.
With LINQKit you can use
PredicateBuilder
to create an extension that will remap the query into a series of&&
tests for each term:which you would use like:
For "john smith", the extension method would create the equivalent of: