문서 메뉴

문서 홈애플리케이션 개발Atlas Device SDK

데이터 필터링 및 정렬 - .NET SDK

이 페이지의 내용

  • LINQ로 쿼리하기
  • 비교 연산자
  • 로직 연산
  • 문자열 연산자
  • 전문 검색
  • 지원되지 않는 LINQ 연산자
  • RQL을 사용한 쿼리
  • 집계 연산자
  • 전문 검색
  • 쿼리 결과 정렬

영역의 데이터를 쿼리, 필터링 및 정렬하려면 Realm 쿼리 엔진을 사용하세요. .NET SDK에서 쿼리 엔진을 사용하는 방법에는 두 가지가 있습니다:

가능하면 쿼리에 LINQ 구문을 사용해야 합니다. 이는 .NET 규칙에 부합하기 때문입니다.

참고

해당 페이지의 예제에 대한 정보

이 페이지의 예제에서는 작업 목록 앱의 간단한 데이터 세트를 사용합니다. 두 가지 Realm 객체 유형은 ProjectTask입니다. Task에는 이름, 담당자 이름, 완료 플래그가 있습니다. 우선 순위를 나타내는 임의 숫자(클수록 더 중요)와 작업에 소요된 시간(분)도 있습니다. Project에는 Tasks가 0개 이상 있습니다.

아래에서 이 두 클래스의 스키마 ProjectTask를 참조하세요.

public partial class Items : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public string Assignee { get; set; }
public bool IsComplete { get; set; }
public int Priority { get; set; }
public int ProgressMinutes { get; set; }
}
public partial class Project : IRealmObject
{
[PrimaryKey]
[MapTo("_id")]
public ObjectId ID { get; set; } = ObjectId.GenerateNewId();
public string Name { get; set; }
public IList<Items> Items { get; }
}

Realm의 쿼리 엔진은 표준 LINQ 를 구현합니다. 구문.

LINQ를 사용하여 Realm 컬렉션을 필터링하는 데 사용할 수 있는 연산자는 여러 가지가 있습니다. 필터는 필터링 대상 컬렉션의 모든 객체에 대한 연산자 표현식을 평가함으로써 작동합니다. 표현식이 true로 확인되면 영역의 결과 컬렉션에 해당 객체가 포함됩니다.

표현식은 다음 중 한 가지로 구성되어 있습니다.

  • 현재 평가 중인 객체의 속성 이름입니다.

  • 연산자

  • 영역에서 사용하는 모든 유형(문자열, 날짜, 숫자, 부울 등)의 값입니다.

참고

Realm .NET SDK는 현재 모든 LINQ 연산자를 지원하지 않습니다. 지원되지 않는 연산자 목록은 지원되지 않는 LINQ 연산자 섹션을 참조하세요.

값 비교

연산자
설명
==
왼쪽 표현식이 오른쪽 표현식과 같은 경우 true(으)로 평가합니다.
>
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦으면 true(으)로 평가합니다.
>=
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦거나 같으면 true(으)로 평가합니다.
<
왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 작으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르면 true(으)로 평가합니다.
<=
왼쪽 숫자 표현식이 오른쪽 숫자 표현식보다 작거나 같으면 true(으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르거나 같으면 true(으)로 평가합니다.
!=
왼쪽 표현식이 오른쪽 표현식과 같지 않은 경우 true(으)로 평가합니다.

예제

다음 예제에서는 쿼리 엔진의 비교 연산자를 사용하여 다음 작업을 수행합니다.

  • priority 속성 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값과 비교하여 우선순위가 작업을 찾습니다.

  • progressMinutes 속성이 특정 범위 내에 속하는지 확인하여 방금 시작한 작업이나 단기 실행 작업을 찾습니다.

  • 속성 assigneenull과 같은 작업을 찾아 할당되지 않은 작업을 찾습니다.

  • 이름 목록에 assignee 속성이 있는지 확인하여 Ali 또는 Jamie라는 특정한 팀원에게 할당된 작업을 찾을 수 있습니다.

var highPri = items.Where(i => i.Priority > 5);
var quickItems = items.Where(i =>
i.ProgressMinutes >= 1 &&
i.ProgressMinutes < 15);
var unassignedItems = items.Where(i =>
i.Assignee == null);
var AliOrJamieItems = items.Where(i =>
i.Assignee == "Ali" ||
i.Assignee == "Jamie");

다음 표에 나열된 논리 연산자를 사용하여 복합 조건자를 만들 수 있습니다.

연산자
설명
&&
왼쪽 및 오른쪽 표현식이 모두 true인 경우 true(으)로 평가합니다.
!
주어진 표현식의 결과를 무효화합니다.
||
두 표현식 중 하나가 true를 반환하면 true(으)로 평가합니다.

예제

쿼리 언어의 논리 연산자를 사용하여 Ali가 완료한 모든 작업을 찾을 수 있습니다. 즉, assignee 속성 값이 'Ali'이고 isComplete 속성 값이 true인 모든 작업을 찾습니다.

var completedItemsForAli = items
.Where(i => i.Assignee == "Ali" && i.IsComplete);

다음 표에 나열된 문자열 연산자를 사용하여 문자열 값을 비교할 수 있습니다. 정규식과 유사한 와일드카드를 사용하면 더욱 유연하게 검색할 수 있습니다.

연산자
설명
StartsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 시작하면 true로 평가합니다. 이는 contains와 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
EndsWith
왼쪽 문자열 표현식이 오른쪽 문자열 표현식으로 끝나는 경우 true(으)로 평가합니다. 이는 contains와(과) 비슷하지만 왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 끝에 있는 경우에만 일치됩니다.
Like

왼쪽 문자열 표현식이 오른쪽 문자열 와일드카드 문자열 표현식과 일치하는 경우 true(으)로 평가합니다. 와일드카드 문자열 표현식은 일반 문자를 두 개의 특수 와일드카드 문자와 함께 사용하는 문자열입니다.

  • * 와일드카드는 0개 또는 그 이상의 어느 문자와든 일치합니다.

  • ? 와일드카드는 어느 문자와든 일치합니다.

예를 들어 와일드카드 문자열 'd?g'는 'dog', 'dig', 'dug'과 일치되지만 'ding', 'dg' 또는 'a dog'와는 일치되지 않습니다.

Equals
true 왼쪽 문자열이 사전순 이면 으)로 평가합니다. 오른쪽 문자열과 동일합니다.
Contains
왼쪽 문자열 표현식이 오른쪽 문자열 표현식의 어느 위치에서든 발견되면 true로 평가합니다.
string.IsNullOrEmpty
왼쪽 문자열 표현식이 null이거나 비어 있으면 true로 평가합니다. IsNullOrEmpty()string의 정적 메서드입니다.

예제

다음 예시에서는 쿼리 엔진의 문자열 연산자를 사용하여 다음을 찾습니다.

// Note: In each of the following examples, you can replace the
// Where() method with First(), FirstOrDefault(),
// Single(), SingleOrDefault(),
// Last(), or LastOrDefault().
// Get all items where the Assignee's name starts with "E" or "e"
var ItemssStartWithE = items.Where(i => i.Assignee.StartsWith("E",
StringComparison.OrdinalIgnoreCase));
// Get all items where the Assignee's name ends wth "is"
// (lower case only)
var endsWith = items.Where(t =>
t.Assignee.EndsWith("is", StringComparison.Ordinal));
// Get all items where the Assignee's name contains the
// letters "ami" in any casing
var itemsContains = items.Where(i => i.Assignee.Contains("ami",
StringComparison.OrdinalIgnoreCase));
// Get all items that have no assignee
var null_or_empty = items.Where(i => string.IsNullOrEmpty(i.Assignee));

중요

사례 비교

문자열을 평가할 때 Like제외한 모든 함수의 두 번째 매개변수는 StringComparison.OrdinalIgnoreCase 또는 StringComparison.Ordinal이어야 합니다. Like() 메서드의 경우 두 번째 매개변수는 부울 값입니다(여기서 "true"는 "대소문자 구분"을 의미합니다).

LINQ를 사용하여 Full Text Search 인덱스 (FTS)가 있는 속성을 쿼리할 수 있습니다. 이러한 속성을 쿼리하려면 QueryMethods.FullTextSearch 를 사용합니다. 다음 예제에서는 Person.Biography 필드를 쿼리합니다.

// Find all people with "scientist" and "Nobel" in their biography
var scientists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist Nobel"));
// Find all people with "scientist" in their biography, but not "physics"
var scientistsButNotPhysicists = realm.All<Person>()
.Where(p => QueryMethods.FullTextSearch(p.Biography, "scientist -physics"));

다음 LINQ 연산자는 현재 Realm .NET SDK에서 지원되지 않습니다.

카테고리
지원되지 않는 연산자
연결
  • Concat

  • Join. Join은 지원되지 않지만, Realm에는 필요하지 않습니다. 기존 관계형 데이터베이스에서처럼 Join 성명서에서 키를 사용하는 대신 다른 유형을 속성으로 참조할 수 있습니다. 자세한 내용은 내장된 객체 - .NET SDK를 참조하세요.

  • GroupJoin

그룹화
  • GroupBy

분할
  • Take

  • Skip

  • TakeWhile

  • SkipWhile

프로젝션
  • SelectMany

  • Select, 한 가지 예외가 있습니다. 쿼리 구문과 함께 사용하는 경우 파생이 아닌 Realm 객체 자체를 선택하는 한 Select가 지원됩니다.

    var tasks = from t in realm.All<Task>() where t.Assignee == "Caleb" select t;

집합 (Sets)
  • Distinct

  • Union

  • Intersect

  • Except

RQL( Realm Query Language )을 사용하여 영역을 쿼리할 수도 있습니다. RQL은 쿼리 엔진에 액세스하는 데 사용되는 문자열 기반 쿼리 언어입니다. RQL을 사용할 때는 Filter() 메서드를 사용합니다.

var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");

중요

LINQ 는 쿼리에 대한 컴파일 타임 오류 검사를 제공하므로 대부분의 경우 RQL 대신 사용해야 합니다. 애그리게이션 사용과 같이 LINQ의 현재 기능 이상의 기능이 필요한 경우 RQL을 사용하세요.

애그리게이션 연산자는 컬렉션 을 순회하여 이를 단일 값으로 줄입니다. 애그리게이션은 Filter() 메서드를 사용하며, 이 메서드는 현재 LINQ 제공자가 지원하지 않는 더 복잡한 쿼리를 만드는 데 사용할 수 있습니다. Filter() 는 필터링 외에도 SORT 및 DISTINCT 절을 지원합니다.

사용 가능한 집계 연산자에 대한 자세한 내용은 RealmQL 집계 연산자 참조를 참조하세요.

다음 예는 데이터를 집계하는 다양한 방법을 보여줍니다.

// Get all projects with an average Item priorty > 5:
var avgPriority = projects.Filter(
"Items.@avg.Priority > $0", 5);
// Get all projects where all Items are high-priority:
var highPriProjects = projects.Filter(
"Items.@min.Priority > $0", 5);
// Get all projects with long-running Items:
var longRunningProjects = projects.Filter(
"Items.@sum.ProgressMinutes > $0", 100);

RealmQL을 사용하여 Full Text Search 인덱스(FTS)가 있는 속성을 쿼리할 수 있습니다. 이러한 속성을 쿼리하려면 TEXT 연산자를 사용합니다. 다음 예에서는 Person.Biography 필드를 쿼리합니다.

// Find all people with "scientist" and "Nobel" in their biography
var filteredScientists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist Nobel");
// Find all people with "scientist" in their biography, but not "physics"
var filteredScientistsButNotPhysicists = realm.All<Person>()
.Filter("Biography TEXT $0", "scientist -physics");

정렬 작업을 사용하면 Realm이 쿼리된 객체를 반환하는 순서를 구성할 수 있습니다. 결과 컬렉션에 있는 객체의 속성을 하나 이상의 기준으로 정렬할 수 있습니다.

Realm은 결과가 정렬될 때 일관된 결과 순서만 보장합니다.

예제

다음 코드는 이름을 기준으로 알파벳 역순으로 프로젝트를 정렬합니다(예: "내림차순" ).

var projectsSorted = projects.OrderByDescending(p => p.Name);
← 데이터 읽기 - .NET SDK