본문 바로가기
Entity Framework Core

ASP.NET Core] Entity Framework Core - SQL Queries

by Fastlane 2023. 5. 9.
728x90
반응형

EF Core는 RDB에서 SQL 쿼리를 사용하도록 허용한다. LINQ를 사용할 수 없거나 비효율적인 SQL이 생성되는 경우 또는 keyless entity type이나 regular entity types을 반환하는 경우 사용할 수 있다. 

Basic SQL queries

1. FromSql

public static System.Linq.IQueryable<TEntity> FromSql<TEntity> (this Microsoft.EntityFrameworkCore.DbSet<TEntity> source, FormattableString sql) where TEntity : class;

interpolated string 으로 SQL query에 기반한 LINQ query를 만든다. 

EF Core 7.0에서 도입되었으며, 이전 버전 사용 시 FormSqlInterpolated 함수를 사용한다. 

DbSet에서 바로 사용되며, 임의의 LINQ query를 사용할 수 없다. 

entity data를 반환하는 쿼리나 SP를 실행할 수 있다. 

SQL injection에 안전하다. 

var blogs = context.Blogs
    .FromSql($"SELECT * FROM dbo.Blogs")
    .ToList();
    
var blogs = context.Blogs
    .FromSql($"EXECUTE dbo.GetMostPopularBlogs")
    .ToList();

// string interpolation 사용
var user = "johndoe";

var blogs = context.Blogs
    .FromSql($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
    .ToList();

//optional parameter를 갖는경우, named parameter를 사용한다. 
var user = new SqlParameter("user", "johndoe");

var blogs = context.Blogs
    .FromSql($"EXECUTE dbo.GetMostPopularBlogsForUser @filterByUser={user}")
    .ToList();

//database parameter를 사용할때 
var user = new SqlParameter("user", "johndoe");

var blogs = context.Blogs
    .FromSql($"EXECUTE dbo.GetMostPopularBlogsForUser {user}")
    .ToList();

2. FromSqlRaw

public static System.Linq.IQueryable<TEntity> FromSqlRaw<TEntity> (this Microsoft.EntityFrameworkCore.DbSet<TEntity> source, string sql, params object[] parameters) where TEntity : class;

raw SQL query에 기반한 LINQ query를 만든다. 

entity data를 반환하는 쿼리나 SP를 실행할 수 있다.

dynamic한 query를 사용하고 싶은 경우, FromSqlRaw를 사용한다. argument로 parameter value를 전달하며, interpolated string을 사용하여 값을 전달하지 않는다. interpolated string을 사용하면 SQL injection공격에 취약하다.

var columnName = "Url";
var columnValue = new SqlParameter("columnValue", "http://SomeURL");

var blogs = context.Blogs
    .FromSqlRaw($"SELECT * FROM [Blogs] WHERE {columnName} = @columnValue", columnValue)
    .ToList();
    
    
var columnValue = "http://SomeURL";

var blogs = context.Blogs
    .FromSqlRaw($"SELECT * FROM [Blogs] WHERE Url = {0}", columnValue)
    .ToList();

3. FormSqlInterpolated 

interpolated string 으로 SQL query에 기반한 LINQ query를 만든다. 

 

4. ExcuteSqlRaw

entity data를 반환하는 않는 쿼리나 SP를 실행할 수 있다.

 

728x90
반응형

댓글