C#을 사용하여 LINQ 쿼리에서 여러 열로 그룹화
이 문서에서는 C#을 사용하는 LINQ 쿼리에 대한 간략한 소개를 제공합니다. 또한 LINQ 쿼리를 사용하여 여러 열을 기준으로 결과를 그룹화하는 방법에 대해 설명합니다.
LINQ에 이미 익숙하다면 소개 섹션을 건너뛰어도 됩니다.
링크 소개
Language Integrated Query의 약자인 LINQ는 데이터베이스, 배열, XML 등과 같은 다양한 데이터 소스의 데이터에 액세스하기 위한 균일한 방법을 제공하는 방법입니다. 모든 쿼리를 자체적으로 통합할 수 있습니다.
개발자가 애플리케이션을 개발할 때 데이터 소스에서 데이터를 수집하려면 프로그래밍 언어 이외의 추가 지식이 필요합니다. 예를 들어 데이터 소스가 데이터베이스인 경우 프로그래머는 SQL에 대한 지식이 필요합니다.
마찬가지로 프로그래머는 데이터 소스가 XML 문서인 경우 XML을 구문 분석하는 방법을 알아야 합니다. LINQ를 사용하는 경우 이러한 모든 데이터 원본에서 데이터를 수집하려면 LINQ에 대한 지식만 있으면 됩니다.
객체에 대한 LINQ
LINQ to Objects는 LINQ 쿼리를 사용하여 메모리 내 데이터 구조에서 데이터를 가져올 수 있음을 의미합니다. 이 데이터 구조는 일부 DotNet 정의 API뿐만 아니라 사용자 정의일 수 있습니다.
데이터 구조에 대한 유일한 요구 사항은 IEnummerable<T>
유형의 컬렉션을 반환해야 한다는 것입니다.
LINQ to Objects의 예를 살펴보겠습니다.
using System;
using System.Linq;
class MyProgram {
static void Main() {
string[] list = { "apple", "ball", "aeroplane", "beautiful", "ancient" };
var starts = from w in list
where w.StartsWith("a") select w;
// Print words
foreach (var word in starts) {
Console.WriteLine(word);
}
}
}
출력:
apple
aeroplane
ancient
위의 코드 조각에서 문자열 배열의 데이터에 액세스하기 위해 LINQ 쿼리를 만들었습니다. 이러한 방식으로 이 배열은 모든 데이터 구조로 대체될 수 있습니다.
LINQ 쿼리의 이점은 뒤쪽의 데이터 구조를 변경하더라도 해당 구문이 동일하게 유지된다는 것입니다. 쿼리는 동일하게 유지됩니다. 이것은 LINQ에서 제공하는 균일성입니다.
LINQ에서 SQL로
LINQ to ADO.Net의 경우 3개의 하위 구성 요소가 있습니다. 그러나 우리는 주로 LINQ to SQL에 초점을 맞출 것입니다.
LINQ to SQL을 사용하면 관계형 데이터베이스를 개체로 변환할 수 있습니다. 데이터 작업을 훨씬 간단하고 빠르게 만듭니다.
다음 프로세스는 먼저 데이터베이스에 연결하고 LINQ 쿼리를 SQL 쿼리로 변환한 다음 해당 SQL 쿼리를 실행하는 것입니다. SQL에서 반환된 결과는 LINQ에 의해 생성된 개체로 다시 변환된 다음 사용자에게 반환됩니다.
LINQ는 또한 개체 데이터의 변경 사항을 추적하고 데이터베이스의 변경 사항을 자동으로 동기화합니다.
프로젝트에서 LINQ to SQL 구성 요소를 만들면 모든 데이터베이스 테이블에 대한 클래스가 자동으로 만들어집니다. 그런 다음 연결 및 데이터베이스 작업에 대한 코드를 작성해야 합니다.
회사 직원의 데이터를 저장하는 테이블이 있다고 가정합니다. 테이블 이름은 Emp
이고 Id
, Name
및 Email
필드를 포함합니다.
LINQ 쿼리로 사용하려면 다음 코드 조각을 고려하세요.
using System;
using System.Linq;
namespace MyLINQExample {
class LINQExample {
static void Main(string[] args) {
string connectString = System.Configuration.ConfigurationManager. ConnectionStrings["LinqToSQLDBConnectionString"].ToString();
LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);
Emp newEmp = new Emp();
newEmp.name = "John";
newEmp.email = "john@abccompany.com";
newEmp.id = 3;
//Add this new employee to the database
db.Emps.InsertOnSubmit(newEmp);
//To save changes in the database
db.SubmitChanges();
//Get the data of inserted employee
Emp e = db.Emps.FirstOrDefault(e ⇒e.name.Equals("John"));
Console.WriteLine("Emp Id = {0} , Name = {1}, Email = {2}",
e.id, e.name, e.email);
Console.WriteLine("\nPress any key to continue.");
Console.ReadKey();
}
}
}
위의 코드에서 우리는 데이터베이스에 연결하고 데이터 컨텍스트 개체를 만든 다음 데이터베이스에서 쿼리를 실행했습니다.
출력:
Emp Id = 3, Name = John, Email = john@abccompany.com
LINQ에서 조인
간단한 SQL 쿼리와 마찬가지로 LINQ 쿼리를 사용하여 열을 조인할 수도 있습니다. 조인 작업은 조건에 따라 다른 테이블의 데이터가 필요할 때 수행됩니다.
LINQ는 단일 또는 여러 열을 쉽게 조인할 수 있는 join
연산자를 제공합니다. 다음 두 클래스가 있다고 가정합니다.
public class Student {
public int Stu_ID { get; set; }
public string Stu_Name { get; set; }
public int Class_ID { get; set; }
}
public class Grade {
public int Grade_ID { get; set; }
public string Grade_Name { get; set; }
}
드라이버 함수에서 다음과 같이 각 클래스에 대해 두 개의 목록을 생성해 보겠습니다.
IList<Student> students_list = new List<Student>() {
new Student() { Stu_ID = 11, Stu_Name = "ABC", Class_ID = 1 },
new Student() { Stu_ID = 12, Stu_Name = "DEF", Class_ID = 1 },
new Student() { Stu_ID = 13, Stu_Name = "GHI", Class_ID = 2 },
new Student() { Stu_ID = 14, Stu_Name = "JKL", Class_ID = 2 },
};
IList<Grade> gradeList = new List<Grade>() { new Grade() { Grade_ID = 1, Grade_Name = "Grade 1" },
new Grade() { Grade_ID = 2, Grade_Name = "Grade 2" },
new Grade() { Grade_ID = 3, Grade_Name = "Grade 3" } };
이제 학생과 학년 이름을 얻으려면 이 두 테이블을 조인해야 합니다. 이 테이블은 각각 Class_ID
및 Grade_ID
를 기반으로 조인됩니다.
조인 쿼리는 다음과 같습니다.
var joinResult =
from s in student_list join g in gradeList on s.Class_ID equals g.Grade_ID select new {
StuName = s.Stu_Name, GradeName = g.Grade_Name
};
그러면 다음과 같은 출력이 생성됩니다.
ABC Grade 1
DEF Grade 1
GHI Grade 2
JKL Grade 2
C#
을 사용하여 LINQ 쿼리에서 여러 열로 그룹화
같은 방식으로 일부 속성을 기반으로 데이터를 그룹화할 수도 있습니다. 이것은 LINQ 쿼리에서 GroupBy
절을 사용하여 수행됩니다.
GroupBy
연산자는 키 값을 기반으로 제공된 컬렉션의 요소 하위 집합을 반환합니다. IGrouping<TKey, TElement>
개체는 각 그룹을 나타냅니다.
또한 GroupBy
메서드는 다양한 오버로드 메서드를 지원하므로 요구 사항에 따라 메서드 구문에서 적절한 확장 메서드를 활용할 수 있습니다.
다음 코드를 고려하십시오.
List<Student> student_List = new List<Student>() {
new Student() { Stu_ID = 11, Stu_Name = "ABC", Age = 18, Subject = "Arts" },
new Student() { Stu_ID = 12, Stu_Name = "DEF", Age = 19, Subject = "Science" },
new Student() { Stu_ID = 13, Stu_Name = "GHI", Age = 18, Subject = "Arts" },
new Student() { Stu_ID = 14, Stu_Name = "JKL", Age = 19, Subject = "Science" },
};
학생 목록을 연령별로 그룹화하려고 한다고 가정합니다. 다음 쿼리가 이를 수행합니다.
var result = from s in student_List group s by s.Age;
foreach (var ageGroups in result) {
Console.WriteLine("Age Group: {0}", ageGroups.Key);
foreach (Student s in ageGroups) // Each group has inner collection
Console.WriteLine("Student Name: {0}", s.Stu_Name);
}
출력:
Age Group: 18
Student Name: ABC
Student Name: GHI
Age Group: 19
Student Name: DEF
Student Name: JKL
마찬가지로 여러 열로 그룹화할 수도 있습니다. 이것은 다음과 같은 방식으로 수행됩니다.
var result = from s in student_List group s by new { s.Age, s.Subject };
foreach (var ageGroups in groupedResult) {
Console.WriteLine("Group: {0}", ageGroups.Key);
foreach (Student s in ageGroups) // Each group has inner collection
Console.WriteLine("Student Name: {0}", s.Stu_Name);
}
이 쿼리는 다음 출력을 생성합니다.
Group: {Age= 18, Subject="Arts"}
Student Name: ABC
Student Name: GHI
Group: {Age= 19, Subject="Science"}
Student Name: DEF
Student Name: JKL
Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.
LinkedIn