MSDN Documentation

Querying Data with Entity Framework

Entity Framework (EF) provides powerful and intuitive ways to query data from your database. It supports LINQ to Entities, allowing you to write queries in C# or VB.NET that are translated into efficient SQL statements.

Basic Queries

The most straightforward way to retrieve data is by using the DbSet<TEntity> property on your DbContext. This property represents a collection of all entities in the context, or that can be queried from the database.


using (var context = new YourDbContext())
{
    // Get all customers
    var allCustomers = context.Customers.ToList();

    // Get a customer by ID
    var customer = context.Customers.Find(1);

    // Filter customers by country
    var usaCustomers = context.Customers
                              .Where(c => c.Country == "USA")
                              .ToList();
}
        

Filtering Data (WHERE Clause)

The Where extension method is used to filter data based on specified conditions. It translates directly to the SQL WHERE clause.


var highValueCustomers = context.Customers
                                .Where(c => c.Orders.Count > 10 && c.TotalSpent > 1000)
                                .ToList();
        

Projection (SELECT Clause)

You can select specific properties from your entities or create new anonymous types using the Select extension method.


var customerNamesAndEmails = context.Customers
                                    .Select(c => new { c.CustomerID, c.FirstName, c.LastName, c.Email })
                                    .ToList();

var customerOrderCount = context.Customers
                                .Select(c => new { c.CustomerID, OrderCount = c.Orders.Count })
                                .ToList();
        

Ordering Data (ORDER BY Clause)

Use OrderBy and OrderByDescending to sort your query results.


var sortedCustomersByName = context.Customers
                                   .OrderBy(c => c.LastName)
                                   .ThenBy(c => c.FirstName)
                                   .ToList();

var recentlyAddedProducts = context.Products
                                   .OrderByDescending(p => p.DateAdded)
                                   .ToList();
        

Paging Data (SKIP and TAKE)

Skip and Take are used for implementing pagination, similar to SQL's OFFSET and FETCH/LIMIT clauses.


int pageNumber = 2;
int pageSize = 10;

var customersPage = context.Customers
                           .OrderBy(c => c.CustomerID)
                           .Skip((pageNumber - 1) * pageSize)
                           .Take(pageSize)
                           .ToList();
        

Joining Data (JOIN Clause)

Entity Framework automatically handles joins when you query related entities. You can also explicitly use Join for complex relationships or when not using navigation properties.


// Implicit Join via Navigation Property
var ordersWithCustomerInfo = context.Orders
                                    .Select(o => new
                                    {
                                        o.OrderID,
                                        o.OrderDate,
                                        CustomerName = o.Customer.FirstName + " " + o.Customer.LastName
                                    })
                                    .ToList();

// Explicit Join (less common for simple relationships)
var orderCustomerJoin = context.Orders
                               .Join(context.Customers,
                                     order => order.CustomerID,
                                     customer => customer.CustomerID,
                                     (order, customer) => new { order, customer })
                               .Select(joined => new
                               {
                                   joined.order.OrderID,
                                   joined.customer.FirstName,
                                   joined.customer.LastName
                               })
                               .ToList();
        

Grouping Data (GROUP BY Clause)

Use the GroupBy extension method to group entities based on a key.


var customersByCountry = context.Customers
                                .GroupBy(c => c.Country)
                                .Select(g => new
                                {
                                    Country = g.Key,
                                    Count = g.Count(),
                                    Customers = g.ToList() // Optional: include the grouped items
                                })
                                .ToList();
        
Performance Considerations:

Asynchronous Queries

Entity Framework fully supports asynchronous operations, which are crucial for responsive applications, especially in web scenarios.


using System.Threading.Tasks;

public async Task<List<Customer>> GetAllCustomersAsync()
{
    using (var context = new YourDbContext())
    {
        return await context.Customers.ToListAsync();
    }
}

public async Task<Customer> GetCustomerByIdAsync(int id)
{
    using (var context = new YourDbContext())
    {
        return await context.Customers.FindAsync(id);
    }
}
        

By leveraging LINQ to Entities and understanding these querying techniques, you can efficiently retrieve and manipulate data with Entity Framework.