Entity Framework does not support all queries. It becomes obvious if you think of something like the following.
dataContext.Persons.Where(person => MyMethod(person));
with MyMethod() returning a boolean value. A method can do everything, and you cannot translate everything into SQL. The solution is to get all the objects in local memory using ToList() and then use LINQ to Object.
dataContext.Persons.ToList().Where(person => MyMethod(person));
It depends on your actual query if it can be rewritten so that it can be converted to SQL using the Entity Framework or if you need to execute the query in local memory using LINQ to Object.
The exception you were talking about looks like you are trying to do something like the following.
Company company = datacontext.Companies.Where(company.Name == "ACME").Single(); dataContext.Employees.Where(employee => employee.Company == company);
LINQ to Entity does not support expressions containing objects, so comparing Company objects is not valid. In this case, you can rewrite it as follows.
dataContext.Employees.Where(employee => employee.Company.Id == company.Id);
It compares only identifiers - a primitive type such as an integer or GUID, and it can be converted to SQL.
Example search by word (see also comments)
IQueryable<People> result = entities.People; foreach (String item in searchList) { // This copy is important in order not to modify the closure. String itemCopy = item; result = result.Where(p => p.FirstName.ToUpper().Contains(itemCopy) || p.LastName.ToUpper().Contains(itemCopy) || p.Phone.ToUpper().Contains(itemCopy)); }
This will build the query word by word. It has been noted that the Entity Framework recognizes ToUpper() , ToLower() and Contains() (and a few more) - so I was strict when I said that the Entity Framework does not recognize method calls. This happens, but not much, not ToUpperInvariant() and ToLowerInvariant() . Further, this query is translated into calls to the CHARINDEX() functions using column sorting, so the search can be case insensitive without explicit calls to ToUpper() or ToLower() .
Daniel BrΓΌckner
source share