Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
/ / /

LINQ로 엔터티 데이터 찾기 및 쿼리

Entity Framework Core를 사용하면 데이터베이스 명령을 명시적으로 실행 하지 않고도 애플리케이션 에서 데이터로 작업할 수 있습니다. 데이터를 쿼리 하려면 LINQ(Language-Integrated Query) 구문을 사용합니다. LINQ를 사용하면 C# 관련 키워드 및 연산자를 사용하여 강력한 형식의 쿼리를 쓰기 (write) 수 있습니다. 애플리케이션 을 실행 하면 EF Core Provider가 자동으로 LINQ 쿼리를 변환하고 MongoDB 쿼리 API 를 사용하여 데이터베이스 에서 실행합니다.

이 가이드 에서는 EF Core Provider를 사용하도록 구성된 애플리케이션 에서 일반적인 쿼리 작업의 예를 확인할 수 있습니다.

EF 코어 제공자를 사용하도록 애플리케이션 을 구성하는 방법을 학습 보려면 EF 코어 제공자 구성을 참조하세요.

이 가이드 의 예제에서는 sample_guides 데이터베이스 의 planets 컬렉션 사용합니다. 이 컬렉션 의 문서는 다음 Planet 클래스를 모델로 사용합니다.

public class Planet
{
public ObjectId _id { get; set; }
public string name { get; set; }
public int orderFromSun { get; set; }
public bool hasRings { get; set; }
}

이 컬렉션은 Atlas에서 제공하는 샘플 데이터 세트 에서 가져온 것입니다. 빠른 시작 가이드 참조하여 무료 MongoDB 클러스터 생성하고 이 샘플 데이터를 로드하는 방법을 학습 .

FirstOrDefault() 메서드를 사용하여 단일 엔터티를 찾거나 Where() 메서드를 사용하여 여러 엔터티를 찾습니다.

FirstOrDefault() 메서드는 collection에서 검색 기준과 일치하는 첫 번째 엔터티를 반환하고, 일치하는 엔터티가 없으면 null 를 반환합니다.

다음 코드는 FirstOrDefault() 메서드를 사용하여 Planets DBSet 에서 name 필드가 'mercury'인 행성을 찾아 콘솔에 행성 이름을 출력합니다.

var planet = db.Planets.FirstOrDefault(p => p.name == "Mercury");
Console.WriteLine(planet.name);

Where() 메서드를 사용하여 collection에서 여러 엔터티를 검색할 수 있습니다. Where() 은 검색 기준과 일치하는 모든 엔터티를 반환합니다.

다음 코드는 Where() 메서드를 사용하여 hasRings 필드가 true 로 설정된 모든 행성을 찾고 행성 이름을 콘솔에 출력합니다.

var planets = db.Planets.Where(p => p.hasRings);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

A 섀도 속성 은 .NET 엔터티 클래스에 정의되지 않았지만 Entity Framework 모델에 포함되며 데이터베이스 의 필드에 매핑되는 속성 입니다. 섀도 속성을 사용하면 문서의 데이터를 엔터티에 속성 으로 노출하지 않고도 쿼리 하거나 추적 수 있습니다.

LINQ 쿼리 에서 섀도 속성 참조하려면 EF.Property<T>() 메서드를 호출하고 구성된 속성 이름을 인수로 전달합니다. 일반 유형 인수는 섀도 속성 의 데이터 유형 과 일치해야 합니다.

예시 를 들어 Planet 클래스는 mainAtmosphere 필드 에 대한 속성 을 정의하지 않습니다. 이 필드 섀도 속성 으로 구성하려면 다음 예시 와 같이 PlanetDbContextOnModelCreating() 메서드에서 Property<T>() 메서드를 호출합니다.

public class PlanetDbContext : DbContext
{
public DbSet<Planet> Planets { get; init; }
public static PlanetDbContext Create(IMongoDatabase database) =>
new(new DbContextOptionsBuilder<PlanetDbContext>()
.UseMongoDB(database.Client, database.DatabaseNamespace.DatabaseName)
.Options);
public PlanetDbContext(DbContextOptions options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Planet>().ToCollection("planets");
modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere");
}
}

modelBuilder.Entity<Planet>().Property<string[]>("mainAtmosphere") 호출은 프레임워크 에 모델에 mainAtmosphere 을 포함하고 이를 MongoDB 의 string[] 필드 에 매핑하도록 지시합니다.

다음 코드는 EF.Property<string[]>() 메서드를 사용하여 비어 있지 않은 mainAtmosphere 그림자 속성 있는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planets = db.Planets.Where(
p => EF.Property<string[]>(p, "mainAtmosphere").Length > 0);
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

필드 존재하는지, 누락되었는지 또는 null 값이 있는지 여부에 따라 Mql 클래스의 메서드를 사용하여 문서를 쿼리 할 수 있습니다.

참고

이러한 메서드는 실제 속성과 그림자 속성 모두에서 작동합니다.

Mql.Exists() 메서드는 필드 값이 null인 문서를 포함하여 지정된 필드 포함하는 문서와 일치합니다.

다음 코드는 Mql.Exists() 메서드를 사용하여 hasRings 필드 있는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planets = db.Planets.Where(p => Mql.Exists(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

Mql.IsMissing() 메서드는 지정된 필드 포함하지 않는 문서와 일치합니다.

다음 코드는 Mql.IsMissing() 메서드를 사용하여 hasRings 필드 없는 모든 행성을 찾고 콘솔에 행성 이름을 출력합니다.

var planets = db.Planets.Where(p => Mql.IsMissing(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

Mql.IsNullOrMissing() 메서드는 지정된 필드 누락되었거나 null 값이 있는 문서와 일치합니다.

다음 코드는 Mql.IsNullOrMissing() 메서드를 사용하여 hasRings 필드 누락되었거나 null 가 있는 모든 행성을 찾아 콘솔에 행성 이름을 출력합니다.

var planets = db.Planets.Where(p => Mql.IsNullOrMissing(p.hasRings));
foreach (var p in planets)
{
Console.WriteLine(p.name);
}

OrderBy() 메서드를 사용하여 쿼리에서 엔터티를 반환할 순서를 지정합니다. OrderBy() 지정된 정렬 기준에 따라 요소를 오름차순으로 정렬합니다.

다음 코드는 OrderBy() 메서드를 사용하여 모든 행성을 찾아 orderFromSun 필드 값을 기준으로 오름차순으로 정렬합니다. 그런 다음 결과를 콘솔에 인쇄합니다.

var planetList = db.Planets.OrderBy(p => p.orderFromSun);
foreach (var p in planetList)
{
Console.WriteLine(p.name);
}
Mercury
Venus
Earth
Mars
Jupiter
Saturn
Uranus
Neptune

내림차순 정렬

OrderByDescending() 메서드를 사용하여 쿼리 결과를 내림차순으로 정렬할 수 있습니다.

ThenBy() 메서드를 사용하여 쿼리를 2차 정렬할 수 있습니다. ThenBy() 메서드는 지정된 정렬 기준에 따라 OrderBy() 메서드의 결과를 오름차순으로 정렬합니다. ThenBy() 메서드는 OrderBy() 메서드에 연결되어야 합니다.

내림차순으로 2차 정렬

ThenByDescending() 메서드를 사용하여 내림차순으로 2차 정렬을 수행할 수 있습니다.

다음 코드에서는 OrderBy()ThenBy() 메서드를 사용하여 모든 행성을 찾아 hasRings() 필드를 기준으로 정렬하고, name 필드에서 2차 정렬을 수행합니다.

var planetList = db.Planets.OrderBy(o => o.hasRings).ThenBy(o => o.name);
foreach (var p in planetList)
{
Console.WriteLine("Has rings: " + p.hasRings + ", Name: " + p.name);
}
Has rings: False, Name: Earth
Has rings: False, Name: Mars
Has rings: False, Name: Mercury
Has rings: False, Name: Venus
Has rings: True, Name: Jupiter
Has rings: True, Name: Neptune
Has rings: True, Name: Saturn
Has rings: True, Name: Uranus

부울 값이 있는 필드를 정렬할 때 필드 값이 false 인 엔터티가 값이 true 인 엔터티보다 먼저 표시됩니다.

EF Core Provider는 다음과 같은 스칼라 집계 메서드를 지원합니다.

  • Count(): 컬렉션 의 요소 수 또는 조건자와 일치하는 문서 수를 반환합니다.

  • LongCount(): 컬렉션 의 요소 수를 long 로 반환하거나 술어와 일치하는 문서 수를 반환합니다.

  • Any(): 컬렉션 의 요소가 조건자와 일치하는 경우 true 를 반환합니다.

  • Max(): 컬렉션 에 있는 지정된 필드 의 최대값을 반환합니다.

  • Min(): 컬렉션 에 있는 지정된 필드 의 최소값을 반환합니다.

  • Sum(): 컬렉션 에서 지정된 필드 값의 합계를 반환합니다.

  • Average(): 컬렉션 에 있는 지정된 필드 값의 평균을 반환합니다.

다음 섹션에서는 앞의 각 메서드의 예를 보여줍니다.

다음 예시 에서는 Count() 메서드를 사용하여 Planets 컬렉션 의 요소 수를 계산합니다.

var planetCount = db.Planets.Count();
Console.WriteLine("Planet Count: " + planetCount);

다음 예시 에서는 Count() 메서드를 사용하여 Planets 컬렉션 에서 hasRings 필드 가 true로 설정하다 요소의 수를 계산합니다.

var planetCountWithRings = db.Planets.Count(p => p.hasRings);
Console.WriteLine("Planet Count with Rings: " + planetCountWithRings);

다음 예시 에서는 LongCount() 메서드를 사용하여 Planets 컬렉션 의 요소 수를 계산하고 결과를 long로 반환합니다.

var planetCountLong = db.Planets.LongCount();
Console.WriteLine("Long Planet Count: " + longCount);

다음 예시 에서는 LongCount() 메서드를 사용하여 Planets 컬렉션 에서 true 로 설정하다 hasRings 필드 있는 요소의 수를 계산하고 결과를 long로 반환합니다.

var planetCountLongWithRings = db.Planets.LongCount(p => p.hasRings);
Console.WriteLine("Long Planet Count with Rings: " + planetCountLongWithRings);

다음 예시 에서는 Any() 메서드를 사용하여 Planets 컬렉션 의 요소에 hasRings 필드 true로 설정하다 있는지 확인합니다.

var results = db.Planets.Any(p => p.hasRings);
foreach (var p in results)
{
Console.WriteLine("Planet with Rings: " + p.name);
}

다음 예시 에서는 Max() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 최대값을 찾습니다.

var furthestPlanet = db.Planets.Max(p => p.orderFromSun);
Console.WriteLine("Furthest Planet: " + furthestPlanet.name);

다음 예시 에서는 Min() 메서드를 사용하여 Planets 컬렉션 에서 orderFromSun 필드 의 최소값을 찾습니다.

var closestPlanet = db.Planets.Min(p => p.OrderFromSun);
Console.WriteLine("Closest Planet: " + closestPlanet.Name);

다음 예시 에서는 Sum() 메서드를 사용하여 Planets 컬렉션 에서 mass 필드 의 합계를 찾습니다.

var totalMass = db.Planets.Sum(p => p.mass);
Console.WriteLine("Total Mass of Planets: " + totalMass);

다음 예시 에서는 Average() 메서드를 사용하여 Planets 컬렉션 에서 mass 필드 의 평균값을 찾습니다.

var averageMass = db.Planets.Average(p => p.mass);
Console.WriteLine("Average Mass of Planets: " + averageMass);

MongoDB 의 애그리게이션에 대해 자세히 학습 MongoDB Server 매뉴얼의 습 가이드 참조하세요.

이 가이드에 설명된 메서드에 대해 자세히 알아보려면 다음 .NET API 문서 링크를 참조하세요.

Mql 클래스 메서드에 대해 자세히 학습 다음 .NET/ C# 드라이버 API 문서 링크를 참조하세요.

돌아가기

구성

이 페이지의 내용