SQL 쿼리를 C# LINQ로 변환하는 방법 (2023)

SQL 쿼리를 C# LINQ로 변환하는 방법 (1)

에드윈 클레스만

에 게시됨• 최초 게시:ekayonline.Medium

SQL 쿼리를 C# LINQ로 변환하는 방법 (3) SQL 쿼리를 C# LINQ로 변환하는 방법 (4) SQL 쿼리를 C# LINQ로 변환하는 방법 (5) SQL 쿼리를 C# LINQ로 변환하는 방법 (6) SQL 쿼리를 C# LINQ로 변환하는 방법 (7)

#csharp #sql #데이터 베이스 #지도 시간

이 기사에서는 SQL 쿼리를 LINQ로 변환하기 위한 기본 단계를 설명합니다. 예제 쿼리를 변환하는 동안 필요한 기본 단계를 배우게 됩니다.

이 문서에서는 SQL에 대한 기본 지식이 있고 C# 코드를 작성하는 방법을 알고 있다고 가정합니다.

소개

구조화된 쿼리 언어(SQL)는 관계형 데이터베이스 작업을 위한 강력한 언어입니다. 다양한 데이터베이스에서 데이터를 검색하고 조작하는 데 널리 사용됩니다. 그러나 C# 코드의 데이터 작업에 관해서는 Language Integrated Query(링크)는 SQL에 대한 대중적인 대안입니다. 이 기사에서는 SQL 쿼리를 수동으로 변환하는 방법을 보여줍니다.링크, 단계별.

SQL 쿼리 예

조인, 몇 가지 where 조건 및 순서를 포함하는 예제 SQL 쿼리부터 시작하겠습니다. 쿼리는 다음과 같습니다.

SELECT Orders.OrderID, Customers.CustomerName, Orders.OrderDateFROM OrdersINNER JOIN Customers ON Orders.CustomerID = Customers.CustomerIDWHERE Orders.ShippedDate IS NULL AND Orders.Freight > 100ORDER BY Orders.OrderDate DESC

LINQ로의 단계별 변환

SQL을 LINQ로 변환할 때 수행해야 하는 전체 단계부터 시작하겠습니다.

1단계: SQL 쿼리 분석

LINQ로 변환해야 하는 쿼리를 선택했으면 최소한 SQL이 어떻게 구성되는지 이해하는 것이 좋습니다.

나는 내가 작성하지 않은 SQL을 사용하여 쿼리를 위에서 아래로 살펴보고 불분명한 부분을 표시하여 이 작업을 자주 수행합니다. 나는 이것을 위해 Visual Studio Code 및 SQL 주석을 사용하는 경향이 있습니다.

-- 명확하지 않은 줄 위에 주석을 작성하는 것

그런 다음 기능을 파악할 수 있도록 명확하지 않은 기능이나 구조를 검색/Google로 검색합니다.

쿼리가 기능적으로 무엇을 하는지 알게 되면 쿼리의 기능을 내 말로 적습니다. 예를 들어 예제 쿼리의 경우 설명은 다음과 같습니다.

쿼리는 Orders 및 Customers 테이블에서 OrderID, CustomerName 및 OrderDate를 검색합니다. 여기서 ShippedDate는 null이고 Freight는 100보다 큽니다. 결과는 OrderDate별로 내림차순으로 정렬됩니다.
그 결과 아직 배송되지 않았으며 운송량이 100개 이상인 신규 주문부터 기존 주문까지의 주문 목록이 생성됩니다.

2단계: 데이터 컨텍스트 클래스 사용

요구 사항 및 솔루션에 이미 구현된 내용에 따라데이터 컨텍스트 클래스. ㅏ데이터 컨텍스트 클래스데이터베이스에 대한 연결을 제공하고 데이터베이스 개체를 C# 클래스에 매핑합니다.
데이터 컨텍스트 클래스수동으로 만들거나 사용할 때엔터티 프레임워크(EF), 그것을 사용하여 *데이터 컨텍스트 클래스 *를 생성할 수 있습니다.

데이터 컨텍스트 클래스 만들기
다음은 예제 쿼리에서 사용할 데이터베이스의 표현으로 코딩된 데이터 컨텍스트 클래스의 예입니다.

공용 클래스 NorthwindDataContext : DbContext{ 공용 DbSet 주문 { 가져오기; 세트; } 공개 DbSet 고객 { get; 세트; } 보호 재정의 무효 OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Northwind"); }}

이 데이터 컨텍스트 클래스는 "Northwind"라는 데이터베이스를 나타내며 주문 및 고객의 두 엔터티를 포함합니다(각 엔터티는 일반적으로 데이터베이스의 테이블임). 또한 데이터베이스에 대한 연결 문자열을 지정합니다.

엔터티 프레임워크(EF) 사용
다음은 Entity Framework를 사용하여 데이터 컨텍스트 클래스를 생성하고 이를 사용하여 LINQ로 데이터를 쿼리하는 단계입니다.

  1. Entity Framework 설치: 아직 수행하지 않은 경우 프로젝트에 EntityFramework 패키지를 추가하여 Entity Framework를 설치합니다. Visual Studio에서 NuGet 패키지 관리자 콘솔을 열고 다음 명령을 실행하여 이 작업을 수행할 수 있습니다.
    설치 패키지 EntityFramework

  2. 데이터 모델 만들기: 데이터 모델이라고도 하는 데이터베이스 스키마를 나타내는 클래스를 만듭니다. Visual Studio에서 Entity Framework 디자이너를 사용하여 이 클래스를 만들 수 있습니다.또는수동으로 코드를 작성하여. 다음은 Northwind 데이터베이스에 대한 간단한 데이터 모델을 정의하는 방법의 예입니다.

공용 클래스 NorthwindDataContext : DbContext { 공용 DbSet 고객 { get; 세트; } public DbSet 주문 { get; 세트; } 보호 재정의 무효 OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() .HasKey(c => c.CustomerID); modelBuilder.Entity() .HasKey(o => o.OrderID); modelBuilder.Entity() .HasRequired(o => o.Customer) .WithMany(c => c.Orders) .HasForeignKey(o => o.CustomerID); } } 공개 클래스 고객 { 공개 문자열 CustomerID { get; 세트; } 공개 문자열 CompanyName { get; 세트; } 공개 문자열 ContactName { get; 세트; } 공개 문자열 ContactTitle { get; 세트; } 공개 문자열 주소 { get; 세트; } 공개 문자열 City { get; 세트; } 공개 문자열 지역 { get; 세트; } 공개 문자열 PostalCode { get; 세트; } 공개 문자열 국가 { 가져오기; 세트; } 공개 문자열 전화 { get; 세트; } 공개 문자열 팩스 { get; 세트; } 공개 가상 ICollection 주문 { get; 세트; } } 공개 클래스 주문 { 공개 int 주문 ID { 가져오기; 세트; } 공개 문자열 CustomerID { get; 세트; } 공개 DateTime OrderDate { 가져오기; 세트; } 공개 DateTime? ShippedDate { get; 세트; } 공공 십진법 Freight { get; 세트; } 공개 가상 고객 고객 { get; 세트; } }

3단계: LINQ 코드 생성

LINQ를 사용하여 데이터를 검색하려면 설명서 또는 EF 특성에 따라 데이터 컨텍스트 클래스와 상호 작용해야 합니다. 코드에는 약간의 차이가 있습니다(주석을 사용하여 설명하겠습니다).

따라서 데이터 컨텍스트 클래스의 DbSet 속성을 사용하겠습니다. 나는 일반적으로 SQL 쿼리에서 위에서 아래로 이동하고 옵션을 찾기 위해 자동 완성을 사용하여 LINQ에 해당 항목을 기록합니다.

이 예에서는 Orders 및 Customers 테이블에서 OrderID, CustomerName 및 OrderDate를 검색하려고 합니다. 다음 LINQ 쿼리를 사용하여 이 작업을 수행할 수 있습니다.

using (var context = new NorthwindDataContext()){ var query = from order in context.Orders는 order.CustomerID의 context.Customers에서 고객을 조인합니다. 여기서 order.ShippedDate == null && order.Freight > 100 orderby order입니다. OrderDate 내림차순 선택 new { order.OrderID, customer.CustomerName, order.OrderDate }; var 결과 = query.ToList();}

이 LINQ 쿼리는 조인을 사용하여 Orders 및 Customers 테이블을 결합합니다. 여기에는 결과를 필터링하는 두 개의 where 조건과 결과를 정렬하는 orderby 절이 포함됩니다.
마지막으로 OrderID, CustomerName 및 OrderDate를 익명 유형으로 선택합니다. 입력 쿼리와 모두 유사합니다.

ORM 기능 사용의 이점
Entity Framework와 같은 ORM을 사용할 때 수행할 수 있는 한 가지 최적화는 소위탐색 속성, "가입" 문을 저장합니다. 예를 들어:

var query = order.ShippedDate == null인 context.Orders의 주문에서 새 { order.OrderID, order.Customer.CustomerName, order.OrderDate }를 선택합니다.

이 LINQ 쿼리에서는 Customer를 사용하여 Orders 엔터티에서 OrderID, CustomerName 및 OrderDate 속성을 선택합니다.탐색 속성연결된 CustomerName을 가져옵니다.

를 사용하여탐색 속성명시적 조인 대신 ORM은 배후에서 적절한 SQL 쿼리를 생성하여 쿼리 실행을 최적화하고 개발자를 위해 코드를 단순화할 수 있습니다.

4단계: LINQ 쿼리 컴파일 및 실행

LINQ를 사용하면 쿼리가 생성 및 설정되지만 실제로 작업을 수행할 때만 실행됩니다.

3단계의 LINQ 예제에서 볼 수 있듯이 결과 변수는 LINQ 쿼리에서 "ToList()"와 같은 메서드가 수행된 후에만 정보를 가져옵니다.

이 줄에 중단점을 설정하면 쿼리를 컴파일하고 실행하여 제대로 작동하는지 확인할 수 있습니다.

존재하지 않는 속성이나 엔터티에 대한 모든 오타나 참조는 유형 검사 및 컴파일 시간 검사가 실제로 사람의 실수를 걸러내는 좋은 방법을 형성하므로 IDE에서 오랫동안 신호를 보내야 합니다.

5단계: 결과 검증

LINQ 코드를 설정하고 적절한 코드로 컴파일되는지 확인한 후 SQL과 LINQ의 결과가 유사한지 테스트하는 것은 상식입니다.

따라서 5단계는 일반적으로 다음 단계에 따라 LINQ가 예상한 결과를 제공하는지 확인할 수 있는 테스트 단계입니다.

테스트 단계 1:SQL 쿼리 실행: 먼저 SQL Server Management Studio 또는 MySQL Workbench와 같은 데이터베이스 관리 도구에서 SQL 쿼리를 실행합니다. 이렇게 하면 비교에 사용할 수 있는 결과 집합이 제공됩니다.

테스트 단계 2:SQL 쿼리 캡처: 다음으로 LINQ에서 생성된 SQL 쿼리를 캡처합니다. 이전에 했던 것처럼 LINQ 쿼리의 ToString() 출력을 검사하여 이 작업을 수행할 수 있습니다.

var query = 컨텍스트의 주문에서. 주문은 컨텍스트에서 고객을 조인합니다. order.CustomerID의 고객은 customer.CustomerID와 같습니다. 여기서 order.ShippedDate == null && order.Freight > 100 orderby order.OrderDate 내림차순 선택 새 { order.OrderID, 고객. CustomerName, order.OrderDate };string sql = query.ToString(); //이것은 이전에 ToList()였지만 이제 문자열이 됩니다.

테스트 단계 3:LINQ 쿼리 실행: 마지막으로 LINQ 쿼리를 실행하고 결과 집합을 SQL 쿼리를 실행하여 얻은 결과 집합과 비교합니다. LINQPad와 같은 도구를 사용하여 LINQ 쿼리를 실행하고 결과를 검사할 수 있습니다.

using (var context = new NorthwindContext()){ var query = from order in context.Orders는 order.CustomerID의 context.Customers에서 고객을 조인합니다. 여기서 order.ShippedDate == null && order.Freight > 100 orderby order입니다. OrderDate 내림차순 선택 new { order.OrderID, customer.CustomerName, order.OrderDate }; var result = query.ToList(); // 결과 집합을 SQL 쿼리 결과 집합과 비교 // ...}

결과 집합을 비교하려면 Beyond Compare 또는 WinMerge와 같은 도구를 사용하여 두 결과 집합의 데이터를 비교할 수 있습니다. 또는 결과 집합을 반복하고 각 행을 비교하는 작은 프로그램을 작성할 수 있습니다.

행 순서나 데이터 형식에 약간의 차이가 있을 수 있으므로 결과를 비교할 때 이러한 차이를 고려해야 할 수 있습니다. 또한 SQL 쿼리와 LINQ 쿼리에 서로 다른 데이터베이스 엔진을 사용하는 경우 데이터 저장 및 검색 방식에 차이가 있을 수 있으므로 이러한 차이점을 알고 있어야 합니다.

전반적으로 SQL 및 LINQ 출력의 동등성을 테스트하는 것은 LINQ 쿼리의 정확성을 확인하는 중요한 단계이며 개발 프로세스 초기에 오류를 발견하는 데 도움이 될 수 있습니다.

또한 쿼리가 원래 SQL 버전과 최소한 동등하게 빠른지 확인하는 것을 잊지 마십시오(내 경험으로는 LINQ가 새 릴리스가 나올 때마다 더 빠르고 더 나은 쿼리를 생성하기 때문에 LINQ가 더 빠른 경우가 많습니다).

그게 다야! SQL 쿼리를 LINQ로 수동 변환했습니다.

SQL 쿼리를 C# LINQ로 변환하는 방법 (8)

결론적으로

이 문서에서는 SQL 쿼리를 LINQ로 수동 변환하는 방법을 보여 주었습니다.

조인, 몇 가지 where 조건 및 순서 지정을 포함하는 예제 SQL 쿼리로 시작했습니다. 그런 다음 변환 프로세스의 각 단계를 시연했습니다.

  • 1단계: SQL 분석

  • 2단계: 데이터 컨텍스트 클래스 사용

  • 3단계: LINQ 코드 생성

  • 4단계: LINQ 쿼리 컴파일 및 실행

  • 5단계: 결과 검증

SQL 분석 작성부터 데이터 컨텍스트 클래스 작성, LINQ 쿼리 실행 및 테스트에 이르기까지 전체 절차는 LINQ에 대한 친숙도와 쿼리의 복잡성에 따라 약 15분에서 80분 정도 소요됩니다.

이 작업을 수동으로 수행하는 데 시간을 절약할 수 있는 더 빠른 방법이 필요한 경우 제가 만든 온라인 도구를 확인하십시오.LINQ 미 업. SQL 입력에서 1분(또는 SQL 쿼리의 크기에 따라 몇 분) 내에 C# LINQ 코드를 생성하는 AI의 기능을 강화하는 변환 도구입니다.

변환 가이드를 읽어 주셔서 감사합니다. 최소한 SQL에서 C# LINQ로 전환하는 방법에 대한 통찰력을 얻으셨기를 바랍니다.

열심히 코딩하세요. 더 열심히 배송하세요 🔥

References

Top Articles
Latest Posts
Article information

Author: Ouida Strosin DO

Last Updated: 12/07/2023

Views: 5337

Rating: 4.6 / 5 (56 voted)

Reviews: 87% of readers found this page helpful

Author information

Name: Ouida Strosin DO

Birthday: 1995-04-27

Address: Suite 927 930 Kilback Radial, Candidaville, TN 87795

Phone: +8561498978366

Job: Legacy Manufacturing Specialist

Hobby: Singing, Mountain biking, Water sports, Water sports, Taxidermy, Polo, Pet

Introduction: My name is Ouida Strosin DO, I am a precious, combative, spotless, modern, spotless, beautiful, precious person who loves writing and wants to share my knowledge and understanding with you.