Search code examples
c#.netentity-frameworklinqlinq-to-entities

How does the Take() method work?


I have a somewhat large table I'm querying in my web app, and I only want to return N number of rows from the table.

I've read through the MSDN documentation, but I can't see where it states if Take() first pulls all of the records from the DB, or if it behaves similar to SQL Server's TOP.

I'm worried if Take() will pull all records, and then get the top N number of records OR will it behave as expected and retrieve only the N number of records directly


Solution

  • See Return Or Skip Elements in a Sequence.

    Take(N) will add TOP N to your SQL and only retrieve N records.

    For example (using my own SQL Server 2014 with EF 6.1):

    This LINQ:

    var query = await dbContext.Lookup
                               .Where(w => w.LookupCd == '1')
                               .Take(10)
                               .ToListAsync();
    

    Generates this SQL:

    SELECT TOP (10) 
        [Extent1].[LookupId] AS [LookupId], 
        [Extent1].[LookupTypeId] AS [LookupTypeId], 
        [Extent1].[LookupCd] AS [LookupCd], 
        [Extent1].[LookupName] AS [LookupName], 
        [Extent1].[LookupDescription] AS [LookupDescription]
    FROM [dbo].[Lookup] AS [Extent1]
    WHERE '1' = [Extent1].[LookupCd]
    

    Use the SQL Profiler (if you're using SQL Server) if you want to be sure what SQL your LINQ is generating. This is always a good practice with any LINQ you write.

    SQL Profiler