Linq-to-SQL, group-by, subqueries and performance
If you’re using Linq-to-SQL, doing group-by and selecting other columns than those in the grouping-key, performance might suffer. This is because there is no good translation of such queries to SQL and Linq-to-SQL has to resort to doing multiple subqueries. Matt Warren explains here. I experienced this firsthand when grouping a lot of geocoded events by latitude and longitude and selecting a few more columns (EventId
and CategoryId
in the example below):
from e in db.Events group e by new { e.Lat, e.Lng } into g select new { g.Key.Lat, g.Key.Lng, es = g.Select(_ => new { _.EventId, _.CategoryId }) };
One possible solution is to fetch all events, to a ToList()
and do the grouping in-memory.
var foo = from e in db.Events select new { e.Lat, e.Lng, e.EventId, e.CategoryId }; var bar = from e in foo.ToList() group e by new { e.Lat, e.Lng } into g select new { g.Key.Lat, g.Key.Lng, es = g.Select(_ => new { _.EventId, _.CategoryId }) };
Leave a Reply