Raw SQL Queries for Unmapped Types in Entity Framework 8
Entity Framework 8 has a new feature that allows you to execute raw SQL queries against the database and return results as unmapped types. To use this...
Entity Framework 8 has a new feature that allows you to execute raw SQL queries against the database and return results as unmapped types.
To use this feature, use the new SqlQuery method on the Database property of your DbContext instance.
This feature is useful when you want your query to return a specific type for a specific purpose. For example, in many cases you don't need/want the overhead of returning your full-blown entity for search queries. Instead, you want a optimized entity (e.g. a DTO) that only contains the data you need for that specific purpose. Usually this results in a faster query and less data transferred over the wire.
See my blog post You can now return unmapped types from raw SQL select statements with Entity Framework 8 for more info about this new feature.
Select Query to retrieve a collectionvar customers = await dbContext.Database// ๐ Map to a unmapped type.SqlQuery<CustomerDto>($"""SELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId""").ToListAsync();
Select Query to retrieve a collectionSELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId
Select Query with a parameter within the where clausevar customers = await dbContext.Database.SqlQuery<CustomerDto>($"""SELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId-- ๐ Use parameters in your queryWHERE c.FirstName like '%' + {customerName} + '%'""").ToListAsync();
Select Query with a parameter within the where clauseexec sp_executesql N'SELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId- ๐ ParameterizedWHERE c.FirstName like ''%'' + @p0 + ''%''',N'@p0 nvarchar(4000)',@p0=N'ali'
Select Query using LINQ to retrieve a single entityvar customer = await dbContext.Database.SqlQuery<CustomerDto>($"""SELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId""")// ๐ SqlQuery returns a IQueryable<TResult> so you can use LINQ as well.SingleOrDefaultAsync(c => c.CustomerId == customerId);
Select Query using LINQ to retrieve a single entityexec sp_executesql N'SELECT TOP(2) [c].[CustomerId], [c].[FirstName], [c].[Street]FROM (SELECTc.Id as CustomerId,c.FirstName,a.StreetFROM dbo.Customers cJOIN dbo.Addresses a ON c.Id = a.CustomerId) AS [c]- ๐ LINQ filters also are parameterizedWHERE [c].[CustomerId] = @__customerId_1',N'@__customerId_1 int',@__customerId_1=1
Feel free to update this developer bit on GitHub, thanks in advance!