Entity Framework Core Tutorial 원시 SQL 쿼리
소개
Entity Framework Core를 사용하면 생성 된 SQL이 충분히 효율적이지 않은 경우 쿼리를 나타 내기 위해 LINQ를 사용할 수없는 데이터베이스에 대해 원시 SQL 쿼리를 직접 실행할 수 있습니다. EF Core는 원시 SQL 쿼리를 실행하는 DbSet.FromSql()
메서드를 제공합니다.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("SELECT * FROM dbo.Customers") .ToList(); }
위의 예에서 원시 SQL 쿼리는 FromSql()
지정되어 Customers 테이블의 모든 레코드를 반환하고 Customer 엔터티로 변환합니다.
매개 변수 전달
SQL을 허용하는 API와 마찬가지로 SQL 주입 공격으로부터 보호하기 위해 모든 사용자 입력을 매개 변수화하는 것이 중요합니다. DbSet.FromSql()
메서드는 C #의 문자열 보간 구문을 사용하여 매개 변수가있는 쿼리도 지원합니다.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("Select * from dbo.Customers where LastName = '{0}'", firstName) .ToList(); }
LINQ 연산자
FromSql()
메서드를 사용하여 원시 쿼리 후에 LINQ 연산자를 사용할 수도 있습니다.
using (var context = new MyContext()) { var customers = context.Customers .FromSql("Select * from dbo.Customers where FirstName = 'Andy'") .OrderByDescending(c => c.Invoices.Count) .ToList(); }
제한 사항
Entity Framework Core에는 몇 가지 제한 사항이 있으므로 원시 SQL 쿼리를 사용할 때이를 확실히 알고 있어야합니다.
-
FromSql()
메서드에 지정된 SQL 쿼리는 엔터티 형식의 모든 속성에 대한 데이터를 반환해야합니다. - 결과 세트의 열 이름은 특성이 맵핑 된 열 이름과 일치해야합니다.
- SQL 쿼리에는 관련 데이터가 포함될 수 없으므로 Include 연산자를 사용하여 관련 데이터를 반환하는 쿼리의 맨 위에 작성할 수 있습니다.
- 제공된 SQL은 하위 쿼리로 처리되므로 전달 된 SQL에 하위 쿼리에 유효하지 않은 문자 나 옵션 (예 : 후행 세미콜론 등)이 없어야합니다.
- SELECT가 아닌 SQL 문은 자동으로 구성 불가능으로 인식됩니다. 결과적으로 저장 프로 시저의 전체 결과는 항상 클라이언트에 반환되고 FromSql 다음에 적용되는 LINQ 연산자는 메모리 내에서 계산됩니다.