2009-05-26 8 views
2

позволяет сказать, что у меня есть таблица с полем DateTime и полем Int и выполнить запрос следующим образом:Подзапросы в LinqToSql гарантированы в том же порядке, что и их родитель?

var query = context.tblSomeTable.Where(s=>s.Name == "Hello World").OrderBy(s=>s.SignUpDate); 

если я затем выполнить два подзапрос с результатом, они до сих пор упорядоченные по дате ?:

var sub1 = query.Where(s=>s.Id = 5); 
var sub2 = query.Where(s=>s.Id = 8); 

В моей кишке говорится, что они все еще в порядке, но имеет ли значение, если исходный запрос был повторен/выполнен еще?

ответ

7

Да, однако, неправильно утверждать, что они «все еще» приказаны. Они заказываются один раз, в конце.

Важно отметить, что LinqtoSql состоит в том, что он просто создает запрос, который выполняется, когда он используется . В приведенном примере вы еще не использовали запрос. Вы просто построить два больших запросов

Они оба будут генерировать это SQL заявление:

select * from tblSomeTable s 
where s.Name = 'Hello World' and s.ID == @p1 
order by s.SignUpDate 

При использовании sub1, @ p1 будет установлен на 5

(На самом деле, 'Hello World' будет проходить как параметр, а также ...)

+0

Это довольно легко проверить с помощью SQL Server Profiler. Поместите точку останова в свой код, где вы создаете свой запрос LINQ, а затем пройдите через каждую строку во время просмотра профилировщика. Вы точно узнаете, когда запрос попадает в базу данных. Это отлично подходит для отладки запросов, так как вы можете видеть их и захватывать их из профилировщика. – Jagd

+0

Есть ли что-нибудь в документации, в которой говорится, что предложение Order By будет отброшено до конца? Учитывая тот факт, что L2S обычно пытается сделать «вещь, которая имеет смысл», я бы предположил, что это нужно, но если она не указана, не зависеть от нее и переместить ваш «порядок» до конца ... –

+0

Оператор SQL выполняется только один раз - когда запрос фактически используется (например, в инструкции foreach или с вызовом .ToList() –

1

Да, он по-прежнему остается в том же порядке. Первый запрос в вашем случае будет IOrderedQueryable, и если вы спросите об этом дальше, sub1 и sub2 также будут IOrderedQueryable и, следовательно, будут поддерживать порядок.

Смежные вопросы