Lo fa meglio che può.
Poiché sembra che si stia utilizzando SQL Server e il suo motore sa che SQL Server dispone di un numero TOP
, lo utilizzerà. Lo userebbe anche con MS Access.
Se si utilizza PostgreSQL, MySQL o SQL Lite, utilizzare LIMIT
.
Potrebbe anche utilizzare "fetch first " + n + " rows only"
(DB2 e SQL: 2008 stile standard) o "select first " + n + "from"
(stile Informix) o "select * from (" + restOfQuery + ") where rownum <= " + n
su Oracle o qualsiasi altra cosa un determinato database necessario.
E se qualcuno ha scritto un motore per un database che non poteva assolutamente supportare tali limiti, poteva effettivamente chiudere il flusso di risultati dopo aver preso ciò di cui aveva bisogno.
In entrambi i casi, fa il meglio che può nel caso particolare.
Inoltre, per inciso, utilizza lo stesso approccio con un valore di 1
per First()
e le sue varianti e con un valore di 2
per Single()
e le sue varianti (in quanto è necessario per cercare di prendere almeno 2 file per verificare che non ci è solo 1 a prendere).
fonte
2015-06-24 10:04:03
Si potrebbe utilizzare SQL Profiler per vedere il codice SQL che genera per voi stessi. Supponendo che chiami .Take() su un IQueryable, dovrebbe eseguire un TOP N contro SQL Server. Io uso sempre il profiler per garantire che Linq-SQL/Entities generi SQL semi-decente. – DaveShaw
Cosa 'Take()' dipende dall'implementazione del database che stai usando e da come lo stai usando. Tutti quelli comuni che ho usato fanno la cosa giusta. –
Quale "LINQ" stai usando? LINQ a SQL? Entity Framework? –