데이터베이스 함수

데이터베이스 함수는 데이터베이스에서 C# 메서드에 해당합니다. 데이터베이스 함수는 0개 이상의 매개 변수를 사용하여 호출할 수 있으며, 매개 변수 값을 기반으로 결과를 계산합니다. 쿼리에 SQL을 사용하는 대부분의 데이터베이스는 데이터베이스 함수를 지원합니다. 따라서 EF Core 쿼리 변환에 의해 생성된 SQL에서도 데이터베이스 함수를 호출할 수 있습니다. C# 메서드는 EF Core에서 데이터베이스 함수로 변환할 필요가 없습니다.

  • C# 메서드에는 해당하는 데이터베이스 함수가 없을 수 있습니다.
    • String.IsNullOrEmpty 메서드는 null 검사 및 데이터베이스의 빈 문자열(함수가 아니라)과의 비교로 변환됩니다.
    • 데이터베이스에서는 문자열 비교를 쉽게 표현하거나 모방할 수 없으므로 데이터베이스에는 String.Equals(String, StringComparison) 메서드에 해당하는 것이 없습니다.
  • 데이터베이스 함수에는 해당하는 C# 메서드가 없을 수 있습니다. 메서드가 없는 C#의 ?? 연산자는 데이터베이스에서 COALESCE 함수로 변환됩니다.

데이터베이스 함수의 형식

EF Core SQL 생성은 데이터베이스에서 사용할 수 있는 기능의 하위 집합을 지원합니다. 이 제한은 지정된 데이터베이스 함수의 LINQ에서 쿼리를 나타내는 기능에서 비롯됩니다. 또한 각 데이터베이스는 데이터베이스 함수를 다양하게 지원하므로 EF Core는 공통 하위 집합을 제공합니다. 데이터베이스 공급자는 더 많은 패턴을 지원하도록 EF Core SQL 생성을 확장할 수 있습니다. 다음은 EF Core에서 지원하고 고유하게 식별하는 데이터베이스 함수 형식입니다. 이러한 용어는 EF Core 공급자와 함께 기본 제공되는 변환을 이해하는 데에도 도움이 됩니다.

기본 제공 함수와 사용자 정의 함수 비교

기본 제공 함수는 미리 정의된 데이터베이스가 제공되지만 사용자 정의 함수는 데이터베이스에서 사용자에 의해 명시적으로 정의됩니다. EF Core는 데이터베이스 함수를 사용하도록 쿼리를 변환할 때 기본 제공 함수를 사용하여 데이터베이스에서 함수를 항상 사용할 수 있도록 합니다. 일부 데이터베이스에서는 SQL을 올바르게 생성하기 위해 기본 제공 함수를 구분해야 합니다. 예를 들어 SqlServer를 사용하려면 모든 사용자 정의 함수가 스키마 정규화된 이름을 사용하여 호출되어야 합니다. 그러나 SqlServer의 기본 제공 함수에는 스키마가 없습니다. PostgreSQL은 public 스키마에서 기본 제공 함수를 정의하지만 스키마 정규화된 이름을 사용하여 호출할 수 있습니다.

집계 함수, 스칼라 함수, 테이블 반환 함수의 비교

  • 스칼라 함수는 정수 또는 문자열과 같은 스칼라 값을 매개 변수로 사용하며, 스칼라 값을 결과로 반환합니다. 스칼라 함수는 스칼라 값을 전달할 수 있는 SQL의 모든 위치에서 사용할 수 있습니다.
  • 집계 함수는 스칼라 값의 스트림을 매개 변수로 사용하며, 스칼라 값을 결과로 반환합니다. 집계 함수는 전체 쿼리 결과 집합 또는 GROUP BY 연산자를 적용하여 생성된 값 그룹에서 적용됩니다.
  • 테이블 반환 함수는 스칼라 값을 매개 변수로 사용하며, 행의 스트림을 결과로 반환합니다. 테이블 반환 함수는 FROM 절에서 테이블 원본으로 사용됩니다.

무항 함수

무항 함수는 매개 변수가 없으며 괄호 없이 호출되어야 하는 특수한 데이터베이스 함수입니다. 무항 함수는 C#의 인스턴스에 대한 속성/필드 액세스와 비슷합니다. 무항 함수는 빈 괄호가 필요하므로 매개 변수가 없는 함수와는 다릅니다. 괄호가 항상 필요한 데이터베이스 함수에는 특별한 이름이 없습니다. 매개 변수 수를 기반으로 하는 데이터베이스 함수의 또 다른 하위 집합은 variadic 함수입니다. variadic 함수는 호출될 때 다양한 수의 매개 변수를 사용할 수 있습니다.

EF Core에서의 데이터베이스 함수 매핑

EF Core는 C# 함수와 데이터베이스 함수 간의 세 가지 매핑 방법을 지원합니다.

기본 제공 함수 매핑

기본적으로 EF Core 공급자는 기본 형식에서 다양한 기본 제공 함수 매핑을 제공합니다. 예를 들어 String.ToLower()은 SqlServer에서 LOWER로 변환됩니다. 사용자는 이 기능을 사용하여 LINQ에서 쿼리를 원활하게 작성할 수 있습니다. 일반적으로 C# 함수가 클라이언트 쪽에서 제공하는 것과 동일한 결과를 제공하는 변환이 데이터베이스에서 제공됩니다. 경우에 따라 이를 위해 실제 변환이 데이터베이스 함수보다 복잡해질 수 있습니다. 일부 시나리오에서는 일치하는 C# 의미 체계가 아닌 가장 적절한 변환도 제공합니다. 일부 C# 멤버 액세스를 위한 공통 변환을 제공하기 위해서도 동일한 기능이 사용됩니다. 예를 들어 String.Length은 SqlServer에서 LEN로 변환됩니다. 공급자 외에 플러그인 작성자도 다른 변환을 추가할 수 있습니다. 이 확장성은 플러그인이 더 많은 형식에 대한 지원을 기본 형식으로 추가하고 메서드를 해당 형식으로 변환하려는 경우에 유용합니다.

EF.Functions 매핑

해당하는 C# 함수가 없는 데이터베이스 함수도 있으므로 EF Core 공급자에게는 특정 데이터베이스 함수를 호출하는 특별한 C# 메서드가 있습니다. 이러한 메서드는 LINQ 쿼리에서 사용할 EF.Functions에 대한 확장 메서드로 정의됩니다. 이러한 메서드는 특정 데이터베이스 함수와 밀접하게 연관되므로 공급자별로 다릅니다. 따라서 한 공급자에서는 작동하는 메서드가 다른 공급자에서는 작동하지 않을 수 있습니다. 또한 이러한 메서드는 변환된 쿼리에서 데이터베이스 함수를 호출하기 위한 것이므로 클라이언트에서 이 함수를 평가하려고 하면 예외가 발생합니다.

사용자 정의 함수 매핑

사용자는 EF Core 공급자가 제공하는 매핑 외에 사용자 지정 매핑을 정의할 수도 있습니다. 사용자 정의 매핑은 사용자 요구 사항에 따라 쿼리 변환을 확장합니다. 이 기능은 사용자가 LINQ 쿼리에서 호출하려고 하는 사용자 정의 함수가 데이터베이스에 있는 경우에 유용합니다.

참고 항목