Использование Entity Framework, в теории, которая быстрее:Каков самый быстрый способ сортировки запроса EF-to-Linq?
// (1) sort then select/project
// in db, for entire table
var results = someQuery
.OrderBy(q => q.FieldA)
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB);
или
// (2) select/project then sort
// in db, on a smaller data set
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.OrderBy(q => q.FieldA)
.ToDictionary(q => q.FieldA, q => q.FieldB);
или
// (3) select/project then materialize then sort
// in object space
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB)
.OrderBy(q => q.FieldA); // -> this won't compile, but you get the question
Я не эксперт SQL, но интуитивно кажется, что 2 быстрее чем 1 ... это правильно? И как это сравнивается с 3, потому что по моему опыту с EF почти все быстрее, когда делается на db.
PS У меня нет перфекционных инструментов в моей среде, и я не уверен, как это проверить, следовательно, вопрос.
Поскольку Linq использует Отложенное выполнение, 1 и 2 эквивалентны. В 3, вы сортируете с помощью Linq для объектов (потому что вы сначала называете 'ToDictionary()' и вы больше не находитесь в области 'IQueryable'), и сортировка будет выполняться в памяти и без' ORDER BY 'будет излучаться. – haim770
Вы можете проверить его таймерами. Почему вы заказываете словарь? Первые 2 - это разные типы, а затем третьи ... –
@ haim770 Да, но это не решает проблему, которая быстрее в теории, сортировка таблицы или ее сортировка? Это кажется интуитивным, но я узнал, что SQL иногда может быть неинтуитивным. –