Filtrar e classificar dados - .NET SDK
Nesta página
Para consultar, filtrar e classificar dados em um realm, use o mecanismo de query do Realm. Há duas maneiras de usar o mecanismo de query com o .NET SDK:
Você deve usar a sintaxe LINQ para consultar quando possível, pois ela se alinha com convenções .NET.
Observação
Sobre os exemplos desta página
Os exemplos nesta página usam um conjunto de dados simples para uma aplicação de lista de tarefas. Os dois tipos de objetos de Realm são Project
e Task
. Task
tem um nome, o nome do responsável e um sinalizador finalizado. Há também um número arbitrário de prioridade – maior é mais importante – e o número de minutos gastos na operação. Um Project
tem zero ou mais Tasks
.
Consulte o esquema para estas duas classes, Project
e Task
, abaixo:
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; } }
Query com LINQ
O mecanismo de query do Realm implementa o padrão LINQ sintaxe.
Existem vários operadores disponíveis para filtrar uma collection do Realm com LINQ. Os filtros funcionam avaliando uma expressão de operador para cada objeto na collection que está sendo filtrada. Se a expressão resolver para true
, o domínio incluirá o objeto na coleção de resultados.
Uma expressão é uma das seguintes opções:
O nome de uma propriedade do objeto que está sendo avaliado
Um operador
Um valor de qualquer tipo usado pelo domínio (string, data, número, booleano etc.)
Observação
O .NET SDK do Realm não é compatível atualmente com todos os operadores do LINQ. Consulte a seção Operadores do LINQ sem suporte para obter uma lista desses operadores.
Operadores de comparação
Comparações de valor
Operador | Descrição |
---|---|
== | Avalia para true se a expressão do lado esquerdo é igual à expressão do lado direito. |
> | Avalia como true se a expressão numérica ou de data do lado esquerdo é maior que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior à data do lado direito. |
>= | Avalia como true se a expressão numérica ou de data do lado esquerdo é maior ou igual à expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é posterior ou igual à data do lado direito. |
< | Avalia como true se a expressão numérica ou de data do lado esquerdo é menor que a expressão numérica ou de data do lado direito. Com datas, avalia como true se a data do lado esquerdo é anterior à data do lado direito. |
<= | Avalia como true se a expressão numérica à esquerda for menor ou igual à expressão numérica à direita. Com datas, avalia como true se a data do lado esquerdo é anterior ou igual à data do lado direito. |
!= | Avalia como true se a expressão do lado esquerdo não é igual à expressão do lado direito. |
Exemplo
O exemplo a seguir usa operadores de comparação do mecanismo de consulta para:
Encontre tarefas de alta prioridade comparando o valor da propriedade
priority
com um número limite, acima do qual a prioridade pode ser considerada alta.Encontre tarefas recém-iniciadas ou de curta duração verificando se a propriedade
progressMinutes
está dentro de um determinado intervalo.Encontre tarefas não atribuídas encontrando tarefas onde a propriedade
assignee
é igual anull
.Encontre tarefas atribuídas a membros específicos da equipe Ali ou Jamie verificando se a propriedade
assignee
está em uma lista de nomes.
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");
Operadores lógicos
Você pode usar os operadores lógicos listados na tabela a seguir para fazer predicados compostos:
Operador | Descrição |
---|---|
&& | Avalia para true se as expressões da esquerda e da direita forem true . |
! | Nega o resultado da expressão fornecida. |
|| | Avalia como true se qualquer uma das expressões retornar true . |
Exemplo
Podemos usar os operadores lógicos da linguagem de consulta para encontrar todas as tarefas concluídas de Ali. Ou seja, encontramos todas as tarefas em que o valor da propriedade assignee
é igual a "Ali" E o valor da propriedade isComplete
é true
:
var completedItemsForAli = items .Where(i => i.Assignee == "Ali" && i.IsComplete);
Operadores de strings
Você pode comparar valores de string usando os operadores de string listados na tabela seguinte. Curingas do tipo Regex permitem mais flexibilidade na pesquisa.
Operador | Descrição |
---|---|
StartsWith | Avalia como true se a expressão de string à esquerda começar com a expressão de string à direita. Isso é semelhante ao contains , mas só corresponde se a expressão de string à esquerda for encontrada no início da expressão de string à direita. |
EndsWith | Avalia como true se a expressão de string à esquerda terminar com a expressão de string à direita. Isso é semelhante ao contains , mas só corresponde se a expressão de cadeia de caracteres à esquerda for encontrada no final da expressão de cadeia de caracteres à direita. |
Like | Avalia como
Por exemplo, a cadeia curinga "d?g" corresponde a "dog", "dig" e "cavg", mas não "ding", "dg" ou "a dog". |
Equals | Avalia para true se a string esquerda for lexicograficamente igual à string direita. |
Contains | Avaliado como true se a expressão de string à esquerda for encontrada em qualquer lugar na expressão de string à direita. |
string.IsNullOrEmpty | Avalia para true se a expressão da string esquerda for nula ou vazia. Note que IsNullOrEmpty() é um método estático em string . |
Exemplo
Os exemplos a seguir usam os operadores de string do mecanismo de query para localizar tarefas:
// 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));
Importante
Comparações de caso
Ao avaliar strings, o segundo parâmetro em todas os roles exceto Like
deve ser StringComparison.OrdinalIgnoreCase
ou StringComparison.Ordinal
. Para o método Like()
, o segundo parâmetro é um valor booleano (onde "true" significa "diferencia maiúsculas de minúsculas").
Busca de texto completo
Você pode usar o LINQ para {query} {properties} que possuem {índice de pesquisa} (FTS). Para consultar essas propriedades, use QueryMethods.FullTextSearch. Os exemplos a seguir consultam o campo 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"));
Operadores LINQ não compatíveis
No momento, os seguintes operadores LINQ não são compatíveis com o Realm .NET SDK:
categoria | Operadores não suportados |
---|---|
Concatenation |
|
Grouping |
|
Partitioning |
|
Projection |
|
Sets |
|
Consulta com linguagem de query de realm
Também é possível usar a Realm Query Language (RQL) para consultar realms. O RQL é uma linguagem de consulta baseada em strings usada para acessar o mecanismo de consulta. Ao usar RQL, você usa o método Filter():
var elvisProjects = projects.Filter("Items.Assignee == $0", "Elvis");
Importante
Operadores agregados
Operadores agregados atravessam uma collection e a reduzem para um único valor. Observe que as aggregations usam o método Filter() , que pode ser usado para criar queries mais complexas que atualmente não são compatíveis com o provedor LINQ. Filter()
é compatível com cláusulas SORT e DISTINCT, além de filtragem.
Para obter mais informações sobre os operadores agregados disponíveis, consulte a Realm Query Language aggregate operator reference.
Os exemplos a seguir mostram maneiras diferentes de agregar dados:
// 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);
Busca de texto completo
Você pode usar o RQL para consultar propriedades que tenham índices the busca de texto completa (FTS) nelas. Para consultar essas propriedades, use o operador TEXT
. O seguinte exemplo consulta o campo 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");
Classificar Resultados da Consulta
Uma operação de classificação permite configurar a ordem na qual o Realm retorna objetos consultados. A classificação pode ser feita com base em uma ou mais propriedades dos objetos na collection de resultados.
O Realm garante apenas uma ordem consistente de resultados quando os resultados são classificados.
Exemplo
O código a seguir classifica os projetos por nome em ordem alfabética inversa (ou seja, "ordem decrescente").
var projectsSorted = projects.OrderByDescending(p => p.Name);