Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the best way to write queries in Entity Framework

What is best way to write query performance wise. e.g. i can write query to get all employes on specific last name as follow

ObjectQuery<Employee> queryEmp =
    context.CreateQuery<Employee>(
    "Select value e from Employees AS e Where e.LastName = @lastName",
    new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });
ObjectResult<Employee> results = query.Execute(MergeOption.AppendOnly);

OR

var v = from e in context.Employees where e.LastName == "Farooqi" select e;

OR

context.Employees.Where(e => e.LastName == "Farooqi");

OR

context.Employees.Where("LastName = @lastName", new ObjectParameter("lastName", typeof(String)) { Value = "Farooqi" });

My question is this that which method for querying is best. What i am confused with is that i think (but not sure) that using last three methods other than the first one will fetch all records of employee from database then by enumerating all records those will be returened which fulfill the specified where condition, so i think last three ways will take more time than the first one so i used only first one. But what is the best one in actual i dont know. Do all method only fetch records form database which fulfill the were condition or fetch all records from db and then enumrated to return filtered records at applicaion end ?

like image 607
Waqar Avatar asked Feb 07 '12 06:02

Waqar


1 Answers

There is little difference; the 2nd/3rd have the advantage of enforcing type correctness at compile-time, since the expression-tree won't compile if LastName doesn't exist or is (say) an int - avoids typos and the issue of "magic strings".

Re your supposition about bringing back everything; no. The 2nd/3rd compile to expression trees, which can be de-constructed and used to create the correct SQL (performing the filter at the server). Very clever, but often misunderstood. The key point is that this is Queryable.Where (taking an Expression<Func<T, bool>>), not Enumerable.Where (taking a Func<T, bool>). Feel free to perform a trace.

Likewise, there is little difference between the 1st/4th - both will filter at the server.

like image 105
Marc Gravell Avatar answered Oct 19 '22 00:10

Marc Gravell