Entity Framework Core recently got v1.1.0. Though it still lacks some critical features like "GROUP BY" SQL translation (see its roadmap) it's time to test it.
The following frameworks will be tested:
- Entity Framework CodeFirst (LINQ query, models generated from DB)
- Entity Framework (raw SQL query)
- LINQ to DB (LINQ query, model entities generated from DB)
- LINQ to DB (raw SQL query)
- Entity Framework Core (doesn't support raw SQL execution at this moment)
Hardware used: i5-4200H, DDR3-1600, Win 10 x64 1607.
Software used: SQL Server 2016 SP1, VS 2015, .NET 4.6.1, EF 6.1.3, LINQ to DB 1.7.5, EF Core 1.1.0.
And default Northwind database.
The tests are the same as in one of the previous articles.
Note: EF Core doesn't use "GROUP BY" in generated SQL, instead it processes it in memory. This can lead to high load on the database in production.
EF Core's context initialization is twice faster than EF 6. It matters for simple and fast queries.
Simple TOP 10 query
Here and below the grey part of bar is context initialization.
We can see that EF Core is faster than EF 6 when running simple queries. Though it's faster than EF 6 both in context initialization as well as in everything else but it still slower twice than LINQ2DB in overall.
Depending on the usage it might not be so bad, because absolute time is low.
Simple TOP 500 query
Results are almost the same, but now EF Core not to far from ADO.NET and LINQ2DB.
Complex TOP 10 query
Almost no difference between frameworks, except EF 6 which is 2x slower than others.
Complex TOP 500 query
The complex query with many result rows makes all frameworks nearly the same (again except EF 6 which is 2x slower than others).
EF Core is faster than EF 6. It's a good thing. But it still can't use "GROUP BY" clause in SQL although it's 1.1.0 version released. It's bad.
Another bad thing about EF Core is that it doesn't support raw SQL execution. It almost doesn't matter for complex queries, but usually applications have many simple queries, and here EF Core is weak - it can't be optimized more. Change tracking doesn't affect selects, and the only way for optimization is raw SQL.
So, if performance is not significant then EF Core can be chose. Otherwise, it's even EF 6 might be more preferable because it supports raw SQL execution which will help in heavy queries.
And if performance is important, or if change tracking is not required, then LINQ2DB may be the best choice. LINQ2DB's LINQ queries are not very slower than raw ADO.NET even for simple queries. And if it's not enough then raw SQL can be used. LINQ2DB is not new, so it hasn't such plenty of bugs as EF Core now.