데이터 필터링 및 정렬 - .NET SDK
이 페이지의 내용
영역의 데이터를 쿼리, 필터링 및 정렬하려면 Realm 쿼리 엔진을 사용하세요. .NET SDK에서 쿼리 엔진을 사용하는 방법에는 두 가지가 있습니다:
가능하면 쿼리에 LINQ 구문을 사용해야 합니다. 이는 .NET 규칙에 부합하기 때문입니다.
참고
해당 페이지의 예시에 대한 정보
이 페이지의 예시에서는 작업 목록 앱의 간단한 데이터 세트를 사용합니다. 두 가지 Realm 객체 유형은 Project
및 Task
입니다. Task
에는 이름, 담당자 이름, 완료 플래그가 있습니다. 우선 순위를 나타내는 임의 숫자(클수록 더 중요)와 작업에 소요된 시간(분)도 있습니다. Project
에는 Tasks
가 0개 이상 있습니다.
아래에서 이 두 클래스의 스키마 Project
및 Task
를 참조하세요.
public partial class Items : IRealmObject { [ ] [ ] 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 { [ ] [ ] public ObjectId ID { get; set; } = ObjectId.GenerateNewId(); public string Name { get; set; } public IList<Items> Items { get; } }
LINQ로 쿼리하기
Realm의 쿼리 엔진 은 표준 LINQ 를 구현합니다. 구문.
LINQ를 사용하여 Realm 컬렉션을 필터링하는 데 사용할 수 있는 연산자는 여러 가지가 있습니다. 필터는 필터링 대상 컬렉션의 모든 객체에 대한 연산자 표현식을 평가함으로써 작동합니다. 표현식이 true
로 확인되면 영역의 결과 컬렉션에 해당 객체가 포함됩니다.
표현식은 다음 중 한 가지로 구성되어 있습니다.
현재 평가 중인 객체의 속성 이름입니다.
연산자
영역에서 사용하는 모든 유형(문자열, 날짜, 숫자, 부울 등)의 값입니다.
참고
현재 Realm .NET SDK는 모든 LINQ 연산자를 지원하지 않습니다. 지원되지 않는 연산자 목록은 지원되지 않는 LINQ 연산자 섹션을 참조하세요.
비교 연산자
값 비교
연산자 | 설명 |
---|---|
== | 왼쪽 표현식이 오른쪽 표현식과 같은 경우 true (으)로 평가합니다. |
> | 왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크면 true (으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦으면 true (으)로 평가합니다. |
>= | 왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 크거나 같으면 true (으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 늦거나 같으면 true (으)로 평가합니다. |
< | 왼쪽 숫자 또는 날짜 표현식이 오른쪽 숫자 또는 날짜 표현식보다 작으면 true (으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르면 true (으)로 평가합니다. |
<= | 왼쪽 숫자 표현식이 오른쪽 숫자 표현식보다 작거나 같으면 true (으)로 평가합니다. 날짜의 경우 왼쪽 날짜가 오른쪽 날짜보다 이르거나 같으면 true (으)로 평가합니다. |
!= | 왼쪽 표현식이 오른쪽 표현식과 같지 않은 경우 true (으)로 평가합니다. |
예시
다음 예시에서는 쿼리 엔진의 비교 연산자를 사용하여 다음 작업을 수행합니다.
priority
속성 값 중 우선 순위가 높은 것으로 간주되는 값을 임계값과 비교하여 우선순위가 작업을 찾습니다.progressMinutes
속성이 특정 범위 내에 속하는지 확인하여 방금 시작한 작업이나 단기 실행 작업을 찾습니다.속성
assignee
이null
과 같은 작업을 찾아 할당되지 않은 작업을 찾습니다.이름 목록에
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 | 왼쪽 문자열 표현식이 오른쪽 문자열 와일드카드 문자열 표현식과 일치하는 경우
예를 들어 와일드카드 문자열 '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 연산자
다음 LINQ 연산자는 현재 Realm .NET SDK에서 지원되지 않습니다.
카테고리 | 지원되지 않는 연산자 |
---|---|
Concatenation |
|
Grouping |
|
Partitioning |
|
Projection |
|
Sets |
|
RQL(Realm Query Language)을 사용한 쿼리
RQL (RQL)을 사용하여 Realm을 쿼리할 수도 있습니다. RQL은 쿼리 엔진에 액세스하는 데 사용되는 문자열 기반 쿼리 언어입니다. RQL을 사용할 때는 Filter() 메서드를 사용합니다.
var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");
중요
집계 연산자
애그리게이션 연산자는 컬렉션 을 순회하여 이를 단일 값으로 줄입니다. 애그리게이션은 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);